/*
Copyright (C) 2003, 2010 - Wolfire Games
-Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file)
+Copyright (C) 2010-2017 - Lugaru contributors (see AUTHORS file)
This file is part of Lugaru.
sscanf(args, "%f%f%f%f", &headprop, &bodyprop, &armprop, &legprop);
- if (Person::players[pnum]->creature == wolftype) {
- Person::players[pnum]->proportionhead = 1.1 * headprop;
- Person::players[pnum]->proportionbody = 1.1 * bodyprop;
- Person::players[pnum]->proportionarms = 1.1 * armprop;
- Person::players[pnum]->proportionlegs = 1.1 * legprop;
- } else if (Person::players[pnum]->creature == rabbittype) {
- Person::players[pnum]->proportionhead = 1.2 * headprop;
- Person::players[pnum]->proportionbody = 1.05 * bodyprop;
- Person::players[pnum]->proportionarms = 1.00 * armprop;
- Person::players[pnum]->proportionlegs = 1.1 * legprop;
- Person::players[pnum]->proportionlegs.y = 1.05 * legprop;
- }
+ Person::players[pnum]->setProportions(headprop, bodyprop, armprop, legprop);
}
static void set_protection(int pnum, const char* args)
{
Person::players[pnum]->numclothes = 0;
Person::players[pnum]->skeleton.drawmodel.textureptr.load(
- creatureskin[Person::players[pnum]->creature][Person::players[pnum]->whichskin], 1,
+ PersonType::types[Person::players[pnum]->creature].skins[Person::players[pnum]->whichskin], 1,
&Person::players[pnum]->skeleton.skinText[0], &Person::players[pnum]->skeleton.skinsize);
}
char buf[64];
snprintf(buf, 63, "Textures/%s.png", args);
+ const std::string file_path = Folders::getResourcePath(buf);
+ FILE* tfile;
+ tfile = fopen(file_path.c_str(), "rb");
+ if (tfile == NULL) {
+ perror((std::string("Couldn't find file ") + file_path + " to assign as clothes").c_str());
+
+ // FIXME: Reduce code duplication with GameTick (should come from a Console class)
+ for (int k = 14; k >= 1; k--) {
+ consoletext[k] = consoletext[k - 1];
+ }
+ consoletext[0] = std::string("Could not load the requested texture '") + args + "', aborting.";
+ consoleselected = 0;
+
+ return;
+ }
+
int id = Person::players[pnum]->numclothes;
strncpy(Person::players[pnum]->clothes[id], buf, 64);
Person::players[pnum]->clothestintr[id] = tintr;
Person::players[pnum]->clothestintb[id] = tintb;
Person::players[pnum]->numclothes++;
- if (!Person::players[pnum]->addClothes(id))
+ if (!Person::players[pnum]->addClothes(id)) {
return;
+ }
Person::players[pnum]->DoMipmaps();
}
+static void list_clothes(int pnum)
+{
+ printf("Clothes from player %d:\n", pnum);
+ for (int i = 0; i < Person::players[pnum]->numclothes; i++) {
+ printf("%s (%f %f %f)\n",
+ Person::players[pnum]->clothes[i],
+ Person::players[pnum]->clothestintr[i],
+ Person::players[pnum]->clothestintg[i],
+ Person::players[pnum]->clothestintb[i]);
+ }
+}
+
/* Console commands themselves */
void ch_quit(const char*)
fpackf(tfile, "Bf Bf Bf", skyboxlightr, skyboxlightg, skyboxlightb);
fpackf(tfile, "Bf Bf Bf Bf Bf Bi", Person::players[0]->coords.x, Person::players[0]->coords.y, Person::players[0]->coords.z,
Person::players[0]->yaw, Person::players[0]->targetyaw, Person::players[0]->num_weapons);
- if (Person::players[0]->num_weapons > 0 && Person::players[0]->num_weapons < 5)
- for (int j = 0; j < Person::players[0]->num_weapons; j++)
+ if (Person::players[0]->num_weapons > 0 && Person::players[0]->num_weapons < 5) {
+ for (int j = 0; j < Person::players[0]->num_weapons; j++) {
fpackf(tfile, "Bi", weapons[Person::players[0]->weaponids[j]].getType());
+ }
+ }
fpackf(tfile, "Bf Bf Bf", Person::players[0]->armorhead, Person::players[0]->armorhigh, Person::players[0]->armorlow);
fpackf(tfile, "Bf Bf Bf", Person::players[0]->protectionhead, Person::players[0]->protectionhigh, Person::players[0]->protectionlow);
for (int k = 0; k < Person::players[0]->numclothes; k++) {
int templength = strlen(Person::players[0]->clothes[k]);
fpackf(tfile, "Bi", templength);
- for (int l = 0; l < templength; l++)
+ for (int l = 0; l < templength; l++) {
fpackf(tfile, "Bb", Person::players[0]->clothes[k][l]);
+ }
fpackf(tfile, "Bf Bf Bf", Person::players[0]->clothestintr[k], Person::players[0]->clothestintg[k], Person::players[0]->clothestintb[k]);
}
fpackf(tfile, "Bi Bf Bf Bf Bf", Hotspot::hotspots[i].type, Hotspot::hotspots[i].size, Hotspot::hotspots[i].position.x, Hotspot::hotspots[i].position.y, Hotspot::hotspots[i].position.z);
int templength = strlen(Hotspot::hotspots[i].text);
fpackf(tfile, "Bi", templength);
- for (int l = 0; l < templength; l++)
+ for (int l = 0; l < templength; l++) {
fpackf(tfile, "Bb", Hotspot::hotspots[i].text[l]);
+ }
}
fpackf(tfile, "Bi", Person::players.size());
fpackf(tfile, "Bi Bi Bf Bf Bf Bi Bi Bf Bb Bf", Person::players[j]->whichskin, Person::players[j]->creature,
Person::players[j]->coords.x, Person::players[j]->coords.y, Person::players[j]->coords.z,
Person::players[j]->num_weapons, Person::players[j]->howactive, Person::players[j]->scale, Person::players[j]->immobile, Person::players[j]->yaw);
- if (Person::players[j]->num_weapons < 5)
- for (int k = 0; k < Person::players[j]->num_weapons; k++)
+ if (Person::players[j]->num_weapons < 5) {
+ for (int k = 0; k < Person::players[j]->num_weapons; k++) {
fpackf(tfile, "Bi", weapons[Person::players[j]->weaponids[k]].getType());
+ }
+ }
if (Person::players[j]->numwaypoints < 30) {
fpackf(tfile, "Bi", Person::players[j]->numwaypoints);
for (int k = 0; k < Person::players[j]->numwaypoints; k++) {
fpackf(tfile, "Bf Bf Bf", Person::players[j]->protectionhead, Person::players[j]->protectionhigh, Person::players[j]->protectionlow);
fpackf(tfile, "Bf Bf Bf", Person::players[j]->metalhead, Person::players[j]->metalhigh, Person::players[j]->metallow);
fpackf(tfile, "Bf Bf", Person::players[j]->power, Person::players[j]->speedmult);
-
- float headprop, bodyprop, armprop, legprop;
- if (Person::players[j]->creature == wolftype) {
- headprop = Person::players[j]->proportionhead.x / 1.1;
- bodyprop = Person::players[j]->proportionbody.x / 1.1;
- armprop = Person::players[j]->proportionarms.x / 1.1;
- legprop = Person::players[j]->proportionlegs.x / 1.1;
- } else {
- // rabbittype
- headprop = Person::players[j]->proportionhead.x / 1.2;
- bodyprop = Person::players[j]->proportionbody.x / 1.05;
- armprop = Person::players[j]->proportionarms.x / 1.00;
- legprop = Person::players[j]->proportionlegs.x / 1.1;
- }
-
- fpackf(tfile, "Bf Bf Bf Bf", headprop, bodyprop, armprop, legprop);
+ fpackf(tfile, "Bf Bf Bf Bf", Person::players[j]->getProportion(0), Person::players[j]->getProportion(1), Person::players[j]->getProportion(2), Person::players[j]->getProportion(3));
fpackf(tfile, "Bi", Person::players[j]->numclothes);
- if (Person::players[j]->numclothes)
+ if (Person::players[j]->numclothes) {
for (int k = 0; k < Person::players[j]->numclothes; k++) {
int templength;
templength = strlen(Person::players[j]->clothes[k]);
fpackf(tfile, "Bi", templength);
- for (int l = 0; l < templength; l++)
+ for (int l = 0; l < templength; l++) {
fpackf(tfile, "Bb", Person::players[j]->clothes[k][l]);
+ }
fpackf(tfile, "Bf Bf Bf", Person::players[j]->clothestintr[k], Person::players[j]->clothestintg[k], Person::players[j]->clothestintb[k]);
}
+ }
}
fpackf(tfile, "Bi", numpathpoints);
for (int j = 0; j < numpathpoints; j++) {
fpackf(tfile, "Bf Bf Bf Bi", pathpoint[j].x, pathpoint[j].y, pathpoint[j].z, numpathpointconnect[j]);
- for (int k = 0; k < numpathpointconnect[j]; k++)
+ for (int k = 0; k < numpathpointconnect[j]; k++) {
fpackf(tfile, "Bi", pathpointconnect[j][k]);
+ }
}
fpackf(tfile, "Bf Bf Bf Bf", mapcenter.x, mapcenter.y, mapcenter.z, mapradius);
fclose(tfile);
}
-void ch_cellar(const char*)
-{
- Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/Furdarko.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
-}
-
void ch_tint(const char* args)
{
sscanf(args, "%f%f%f", &tintr, &tintg, &tintb);
void ch_sizenear(const char* args)
{
int closest = findClosestPlayer();
- if (closest >= 0)
+ if (closest >= 0) {
Person::players[closest]->scale = atof(args) * .2;
+ }
}
void ch_proportion(const char* args)
void ch_proportionnear(const char* args)
{
int closest = findClosestPlayer();
- if (closest >= 0)
+ if (closest >= 0) {
set_proportion(closest, args);
+ }
}
void ch_protection(const char* args)
void ch_protectionnear(const char* args)
{
int closest = findClosestPlayer();
- if (closest >= 0)
+ if (closest >= 0) {
set_protection(closest, args);
+ }
}
void ch_armor(const char* args)
void ch_armornear(const char* args)
{
int closest = findClosestPlayer();
- if (closest >= 0)
+ if (closest >= 0) {
set_armor(closest, args);
+ }
}
void ch_protectionreset(const char*)
void ch_noclothesnear(const char* args)
{
int closest = findClosestPlayer();
- if (closest >= 0)
+ if (closest >= 0) {
set_noclothes(closest, args);
+ }
}
void ch_clothes(const char* args)
void ch_clothesnear(const char* args)
{
int closest = findClosestPlayer();
- if (closest >= 0)
+ if (closest >= 0) {
set_clothes(closest, args);
+ }
+}
+
+void ch_clotheslist(const char*)
+{
+ list_clothes(0);
+}
+
+void ch_clotheslistnear(const char*)
+{
+ int closest = findClosestPlayer();
+ if (closest >= 0) {
+ list_clothes(closest);
+ }
}
void ch_belt(const char*)
void ch_cellophane(const char*)
{
cellophane = !cellophane;
- float mul = (cellophane ? 0 : 1);
-
- for (auto player : Person::players) {
- player->proportionhead.z = player->proportionhead.x * mul;
- player->proportionbody.z = player->proportionbody.x * mul;
- player->proportionarms.z = player->proportionarms.x * mul;
- player->proportionlegs.z = player->proportionlegs.x * mul;
- }
}
void ch_funnybunny(const char*)
{
- Person::players[0]->creature = rabbittype;
- Person::players[0]->skeletonLoad(true);
- Person::players[0]->scale = .2;
+ Person::players[0]->changeCreatureType(rabbittype);
Person::players[0]->headless = 0;
- Person::players[0]->damagetolerance = 200;
set_proportion(0, "1 1 1 1");
}
void ch_wolfie(const char*)
{
- Person::players[0]->creature = wolftype;
- Person::players[0]->skeletonLoad();
- Person::players[0]->damagetolerance = 300;
+ Person::players[0]->changeCreatureType(wolftype);
set_proportion(0, "1 1 1 1");
}
-void ch_wolfieisgod(const char* args)
-{
- ch_wolfie(args);
-}
-
-void ch_wolf(const char*)
-{
- Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/Wolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
-}
-
-void ch_snowwolf(const char*)
-{
- Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/SnowWolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
-}
-
-void ch_darkwolf(const char*)
-{
- Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/DarkWolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
-}
-
void ch_lizardwolf(const char*)
{
- Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/LizardWolf.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
-}
-
-void ch_white(const char*)
-{
- Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/Fur.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
+ Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/FurWolfLizard.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
}
-void ch_brown(const char*)
+void ch_darko(const char*)
{
- Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/Fur3.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
-}
-
-void ch_black(const char*)
-{
- Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/Fur2.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
+ Person::players[0]->skeleton.drawmodel.textureptr.load("Textures/FurDarko.jpg", 1, &Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
}
void ch_sizemin(const char*)
{
- for (unsigned i = 1; i < Person::players.size(); i++)
- if (Person::players[i]->scale < 0.8 * 0.2)
+ for (unsigned i = 1; i < Person::players.size(); i++) {
+ if (Person::players[i]->scale < 0.8 * 0.2) {
Person::players[i]->scale = 0.8 * 0.2;
+ }
+ }
}
void ch_tutorial(const char* args)
void ch_type(const char* args)
{
int n = sizeof(editortypenames) / sizeof(editortypenames[0]);
- for (int i = 0; i < n; i++)
+ for (int i = 0; i < n; i++) {
if (stripfx(args, editortypenames[i])) {
editoractive = i;
break;
}
+ }
}
void ch_path(const char* args)
{
unsigned int n = sizeof(pathtypenames) / sizeof(pathtypenames[0]);
- for (unsigned int i = 0; i < n; i++)
+ for (unsigned int i = 0; i < n; i++) {
if (stripfx(args, pathtypenames[i])) {
editorpathtype = i;
break;
}
+ }
}
void ch_hs(const char* args)
strcat(Hotspot::hotspots.back().text, "\n");
}
-void ch_dialogue(const char* args)
+void ch_dialog(const char* args)
{
int type;
char buf1[32];
Dialog::whichdialogue = Dialog::dialogs.size();
}
-void ch_fixdialogue(const char* args)
+void ch_fixdialog(const char* args)
{
char buf1[32];
- int whichdi;
+ int whichdlg = 0;
- sscanf(args, "%d %31s", &whichdi, buf1);
+ sscanf(args, "%d %31s", &whichdlg, buf1);
std::string filename = std::string("Dialogues/") + buf1 + ".txt";
- Dialog::dialogs[whichdi] = Dialog(Dialog::dialogs[whichdi].type, filename);
+ Dialog::dialogs[whichdlg] = Dialog(Dialog::dialogs[whichdlg].type, filename);
}
void ch_fixtype(const char* args)
{
- int dlg;
- sscanf(args, "%d", &dlg);
- Dialog::dialogs[0].type = dlg;
+ int whichdlg = 0;
+ int type = 0;
+ sscanf(args, "%d %d", &whichdlg, &type);
+ Dialog::dialogs[whichdlg].type = type;
}
void ch_fixrotation(const char*)
Dialog::currentDialog().participantyaw[playerId] = Person::players[playerId]->yaw;
}
-void ch_ddialogue(const char*)
+void ch_ddialog(const char* args)
{
- if (!Dialog::dialogs.empty()) {
+ if (Dialog::dialogs.empty() || Dialog::inDialog()) {
+ return;
+ }
+
+ int dlg = -1;
+ sscanf(args, "%d", &dlg);
+ if (dlg == -1) {
+ // Remove last entry
Dialog::dialogs.pop_back();
+ return;
+ }
+
+ if (dlg >= int(Dialog::dialogs.size())) {
+ // Invalid index, abort
+ return;
}
+
+ // Erase given index, higher indexes will be decreased by 1
+ Dialog::dialogs.erase(Dialog::dialogs.begin() + dlg);
}
void ch_dhs(const char*)
void ch_allimmobile(const char*)
{
- for (unsigned i = 1; i < Person::players.size(); i++)
+ for (unsigned i = 1; i < Person::players.size(); i++) {
Person::players[i]->immobile = 1;
+ }
}
void ch_mobile(const char*)
Person::players[0]->metallow = 1;
Person::players[0]->power = 1;
Person::players[0]->speedmult = 1;
- Person::players[0]->scale = 1;
-
- if (Person::players[0]->creature == wolftype) {
- Person::players[0]->proportionhead = 1.1;
- Person::players[0]->proportionbody = 1.1;
- Person::players[0]->proportionarms = 1.1;
- Person::players[0]->proportionlegs = 1.1;
- } else if (Person::players[0]->creature == rabbittype) {
- Person::players[0]->proportionhead = 1.2;
- Person::players[0]->proportionbody = 1.05;
- Person::players[0]->proportionarms = 1.00;
- Person::players[0]->proportionlegs = 1.1;
- Person::players[0]->proportionlegs.y = 1.05;
- }
+ Person::players[0]->scale = PersonType::types[Person::players[0]->creature].defaultScale;
+
+ Person::players[0]->setProportions(1, 1, 1, 1);
Person::players[0]->numclothes = 0;
Person::players[0]->skeleton.drawmodel.textureptr.load(
- creatureskin[Person::players[0]->creature][Person::players[0]->whichskin], 1,
+ PersonType::types[Person::players[0]->creature].skins[Person::players[0]->whichskin], 1,
&Person::players[0]->skeleton.skinText[0], &Person::players[0]->skeleton.skinsize);
editoractive = typeactive;