00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00030
00031
00032
00033
00034
00035 #include <stdio.h>
00036 #include <stdlib.h>
00037 #include <string.h>
00038
00039 #include "stratagus.h"
00040 #include "unittype.h"
00041 #include "unit_cache.h"
00042 #include "player.h"
00043 #include "script.h"
00044 #include "ai.h"
00045 #include "actions.h"
00046 #include "commands.h"
00047
00048
00049
00050
00051
00052
00053
00054
00055
00061 static int CclPlayer(lua_State *l)
00062 {
00063 const char *value;
00064 CPlayer *player;
00065 int i;
00066 int args;
00067 int j;
00068 int subargs;
00069 int k;
00070
00071 args = lua_gettop(l);
00072 j = 0;
00073
00074 i = LuaToNumber(l, j + 1);
00075 ++j;
00076 player = &Players[i];
00077 if (NumPlayers <= i) {
00078 NumPlayers = i + 1;
00079 }
00080 player->Index = i;
00081 memset(player->Units, 0, sizeof(player->Units));
00082
00083
00084
00085
00086 for (; j < args; ++j) {
00087 value = LuaToString(l, j + 1);
00088 ++j;
00089
00090 if (!strcmp(value, "name")) {
00091 player->SetName(LuaToString(l, j + 1));
00092 } else if (!strcmp(value, "type")) {
00093 value = LuaToString(l, j + 1);
00094 if (!strcmp(value, "neutral")) {
00095 player->Type = PlayerNeutral;
00096 } else if (!strcmp(value, "nobody")) {
00097 player->Type = PlayerNobody;
00098 } else if (!strcmp(value, "computer")) {
00099 player->Type = PlayerComputer;
00100 } else if (!strcmp(value, "person")) {
00101 player->Type = PlayerPerson;
00102 } else if (!strcmp(value, "rescue-passive")) {
00103 player->Type = PlayerRescuePassive;
00104 } else if (!strcmp(value, "rescue-active")) {
00105 player->Type = PlayerRescueActive;
00106 } else {
00107 LuaError(l, "Unsupported tag: %s" _C_ value);
00108 }
00109 } else if (!strcmp(value, "ai-name")) {
00110 player->AiName = LuaToString(l, j + 1);
00111 } else if (!strcmp(value, "team")) {
00112 player->Team = LuaToNumber(l, j + 1);
00113 } else if (!strcmp(value, "enemy")) {
00114 value = LuaToString(l, j + 1);
00115 for (i = 0; i < PlayerMax && *value; ++i, ++value) {
00116 if (*value == '-' || *value == '_' || *value == ' ') {
00117 player->Enemy &= ~(1 << i);
00118 } else {
00119 player->Enemy |= (1 << i);
00120 }
00121 }
00122 } else if (!strcmp(value, "allied")) {
00123 value = LuaToString(l, j + 1);
00124 for (i = 0; i < PlayerMax && *value; ++i, ++value) {
00125 if (*value == '-' || *value == '_' || *value == ' ') {
00126 player->Allied &= ~(1 << i);
00127 } else {
00128 player->Allied |= (1 << i);
00129 }
00130 }
00131 } else if (!strcmp(value, "shared-vision")) {
00132 value = LuaToString(l, j + 1);
00133 for (i = 0; i < PlayerMax && *value; ++i, ++value) {
00134 if (*value == '-' || *value == '_' || *value == ' ') {
00135 player->SharedVision &= ~(1 << i);
00136 } else {
00137 player->SharedVision |= (1 << i);
00138 }
00139 }
00140 } else if (!strcmp(value, "start")) {
00141 if (!lua_istable(l, j + 1) || lua_objlen(l, j + 1) != 2) {
00142 LuaError(l, "incorrect argument");
00143 }
00144 lua_rawgeti(l, j + 1, 1);
00145 player->StartX = LuaToNumber(l, -1);
00146 lua_pop(l, 1);
00147 lua_rawgeti(l, j + 1, 2);
00148 player->StartY = LuaToNumber(l, -1);
00149 lua_pop(l, 1);
00150 } else if (!strcmp(value, "production-rate")) {
00151 if (!lua_istable(l, j + 1)) {
00152 LuaError(l, "incorrect argument");
00153 }
00154 subargs = lua_objlen(l, j + 1);
00155 for (k = 0; k < subargs; ++k) {
00156 lua_rawgeti(l, j + 1, k + 1);
00157 value = LuaToString(l, -1);
00158 lua_pop(l, 1);
00159 ++k;
00160
00161 for (i = 0; i < MaxCosts; ++i) {
00162 if (value == DefaultResourceNames[i]) {
00163 lua_rawgeti(l, j + 1, k + 1);
00164 player->ProductionRate[i] = LuaToNumber(l, -1);
00165 lua_pop(l, 1);
00166 break;
00167 }
00168 }
00169 if (i == MaxCosts) {
00170 LuaError(l, "Unsupported tag: %s" _C_ value);
00171 }
00172 }
00173 } else if (!strcmp(value, "stored-resources")) {
00174 if (!lua_istable(l, j + 1)) {
00175 LuaError(l, "incorrect argument");
00176 }
00177 subargs = lua_objlen(l, j + 1);
00178 for (k = 0; k < subargs; ++k) {
00179 lua_rawgeti(l, j + 1, k + 1);
00180 value = LuaToString(l, -1);
00181 lua_pop(l, 1);
00182 ++k;
00183
00184 for (i = 0; i < MaxCosts; ++i) {
00185 if (value == DefaultResourceNames[i]) {
00186 lua_rawgeti(l, j + 1, k + 1);
00187 player->StoredResources[i] = LuaToNumber(l, -1);
00188 lua_pop(l, 1);
00189 break;
00190 }
00191 }
00192 if (i == MaxCosts) {
00193 LuaError(l, "Unsupported tag: %s" _C_ value);
00194 }
00195 }
00196 } else if (!strcmp(value, "storage-capacity")) {
00197 if (!lua_istable(l, j + 1)) {
00198 LuaError(l, "incorrect argument");
00199 }
00200 subargs = lua_objlen(l, j + 1);
00201 for (k = 0; k < subargs; ++k) {
00202 lua_rawgeti(l, j + 1, k + 1);
00203 value = LuaToString(l, -1);
00204 lua_pop(l, 1);
00205 ++k;
00206
00207 for (i = 0; i < MaxCosts; ++i) {
00208 if (value == DefaultResourceNames[i]) {
00209 lua_rawgeti(l, j + 1, k + 1);
00210 player->StorageCapacity[i] = LuaToNumber(l, -1);
00211 lua_pop(l, 1);
00212 break;
00213 }
00214 }
00215 if (i == MaxCosts) {
00216 LuaError(l, "Unsupported tag: %s" _C_ value);
00217 }
00218 }
00219 } else if (!strcmp(value, "ai-enabled")) {
00220 player->AiEnabled = 1;
00221 --j;
00222 } else if (!strcmp(value, "ai-disabled")) {
00223 player->AiEnabled = 0;
00224 --j;
00225 } else if (!strcmp(value, "unit-limit")) {
00226 player->UnitLimit = LuaToNumber(l, j + 1);
00227 } else if (!strcmp(value, "building-limit")) {
00228 player->BuildingLimit = LuaToNumber(l, j + 1);
00229 } else if (!strcmp(value, "total-unit-limit")) {
00230 player->TotalUnitLimit = LuaToNumber(l, j + 1);
00231 } else if (!strcmp(value, "score")) {
00232 player->Score = LuaToNumber(l, j + 1);
00233 } else if (!strcmp(value, "total-units")) {
00234 player->TotalUnits = LuaToNumber(l, j + 1);
00235 } else if (!strcmp(value, "total-buildings")) {
00236 player->TotalBuildings = LuaToNumber(l, j + 1);
00237 } else if (!strcmp(value, "total-razings")) {
00238 player->TotalRazings = LuaToNumber(l, j + 1);
00239 } else if (!strcmp(value, "total-kills")) {
00240 player->TotalKills = LuaToNumber(l, j + 1);
00241 } else if (!strcmp(value, "total-resources")) {
00242 if (!lua_istable(l, j + 1)) {
00243 LuaError(l, "incorrect argument");
00244 }
00245 subargs = lua_objlen(l, j + 1);
00246 if (subargs != MaxCosts) {
00247 LuaError(l, "Wrong number of total-resources: %d" _C_ i);
00248 }
00249 for (k = 0; k < subargs; ++k) {
00250 lua_rawgeti(l, j + 1, k + 1);
00251 player->TotalResources[k] = LuaToNumber(l, -1);
00252 lua_pop(l, 1);
00253 }
00254 } else if (!strcmp(value, "color")) {
00255 int r;
00256 int g;
00257 int b;
00258
00259 if (!lua_istable(l, j + 1) || lua_objlen(l, j + 1) != 3) {
00260 LuaError(l, "incorrect argument");
00261 }
00262 lua_rawgeti(l, j + 1, 1);
00263 r = LuaToNumber(l, -1);
00264 lua_pop(l, 1);
00265 lua_rawgeti(l, j + 1, 2);
00266 g = LuaToNumber(l, -1);
00267 lua_pop(l, 1);
00268 lua_rawgeti(l, j + 1, 3);
00269 b = LuaToNumber(l, -1);
00270 lua_pop(l, 1);
00271 player->Color = Video.MapRGB(TheScreen->format, r, g, b);
00272 } else {
00273 LuaError(l, "Unsupported tag: %s" _C_ value);
00274 }
00275 }
00276
00277 return 0;
00278 }
00279
00285 static int CclChangeUnitsOwner(lua_State *l)
00286 {
00287 CUnit *table[UnitMax];
00288 int n;
00289 int oldp;
00290 int newp;
00291 int x1;
00292 int y1;
00293 int x2;
00294 int y2;
00295
00296 LuaCheckArgs(l, 4);
00297 if (!lua_istable(l, 1) || !lua_istable(l, 2)) {
00298 LuaError(l, "incorrect argument");
00299 }
00300 if (lua_objlen(l, 1) != 2) {
00301 LuaError(l, "incorrect argument");
00302 }
00303 lua_rawgeti(l, 1, 1);
00304 x1 = LuaToNumber(l, -1);
00305 lua_pop(l, 1);
00306 lua_rawgeti(l, 1, 1);
00307 y1 = LuaToNumber(l, -1);
00308 lua_pop(l, 1);
00309
00310 if (lua_objlen(l, 2) != 2) {
00311 LuaError(l, "incorrect argument");
00312 }
00313 lua_rawgeti(l, 2, 1);
00314 x2 = LuaToNumber(l, -1);
00315 lua_pop(l, 1);
00316 lua_rawgeti(l, 2, 1);
00317 y2 = LuaToNumber(l, -1);
00318 lua_pop(l, 1);
00319
00320 n = UnitCache.Select(x1, y1, x2 + 1, y2 + 1, table, UnitMax);
00321 oldp = LuaToNumber(l, 3);
00322 newp = LuaToNumber(l, 4);
00323 while (n) {
00324 if (table[n - 1]->Player->Index == oldp) {
00325 table[n - 1]->ChangeOwner(&Players[newp]);
00326 }
00327 --n;
00328 }
00329
00330 return 0;
00331 }
00332
00338 static int CclSetMaxSelectable(lua_State *l)
00339 {
00340 LuaCheckArgs(l, 1);
00341 MaxSelectable = LuaToNumber(l, 1);
00342
00343 lua_pushnumber(l, MaxSelectable);
00344 return 1;
00345 }
00346
00352 static int CclSetAllPlayersUnitLimit(lua_State *l)
00353 {
00354 int i;
00355
00356 LuaCheckArgs(l, 1);
00357 for (i = 0; i < PlayerMax; ++i) {
00358 Players[i].UnitLimit = LuaToNumber(l, 1);
00359 }
00360
00361 lua_pushnumber(l, lua_tonumber(l, 1));
00362 return 1;
00363 }
00364
00370 static int CclSetAllPlayersBuildingLimit(lua_State *l)
00371 {
00372 int i;
00373
00374 LuaCheckArgs(l, 1);
00375 for (i = 0; i < PlayerMax; ++i) {
00376 Players[i].BuildingLimit = LuaToNumber(l, 1);
00377 }
00378
00379 lua_pushnumber(l, lua_tonumber(l, 1));
00380 return 1;
00381 }
00382
00388 static int CclSetAllPlayersTotalUnitLimit(lua_State *l)
00389 {
00390 int i;
00391
00392 LuaCheckArgs(l, 1);
00393 for (i = 0; i < PlayerMax; ++i) {
00394 Players[i].TotalUnitLimit = LuaToNumber(l, 1);
00395 }
00396
00397 lua_pushnumber(l, lua_tonumber(l, 1));
00398 return 1;
00399 }
00400
00406 static int CclSetDiplomacy(lua_State *l)
00407 {
00408 int plynr;
00409 int base;
00410 const char *state;
00411
00412 LuaCheckArgs(l, 3);
00413 base = LuaToNumber(l, 1);
00414 plynr = LuaToNumber(l, 3);
00415 state = LuaToString(l, 2);
00416
00417 if (!strcmp(state, "allied")) {
00418 SendCommandDiplomacy(base, DiplomacyAllied, plynr);
00419 } else if (!strcmp(state, "neutral")) {
00420 SendCommandDiplomacy(base, DiplomacyNeutral, plynr);
00421 } else if (!strcmp(state, "crazy")) {
00422 SendCommandDiplomacy(base, DiplomacyCrazy, plynr);
00423 } else if (!strcmp(state, "enemy")) {
00424 SendCommandDiplomacy(base, DiplomacyEnemy, plynr);
00425 }
00426
00427 return 0;
00428 }
00429
00435 static int CclDiplomacy(lua_State *l)
00436 {
00437 lua_pushnumber(l, ThisPlayer->Index);
00438 lua_insert(l, 1);
00439 return CclSetDiplomacy(l);
00440 }
00441
00447 static int CclSetSharedVision(lua_State *l)
00448 {
00449 int plynr;
00450 int base;
00451 bool shared;
00452
00453 LuaCheckArgs(l, 3);
00454
00455 base = LuaToNumber(l, 1);
00456 shared = LuaToBoolean(l, 2);
00457 plynr = LuaToNumber(l, 3);
00458
00459 SendCommandSharedVision(base, shared, plynr);
00460
00461 return 0;
00462 }
00463
00469 static int CclSharedVision(lua_State *l)
00470 {
00471 lua_pushnumber(l, ThisPlayer->Index);
00472 lua_insert(l, 1);
00473 return CclSetSharedVision(l);
00474 }
00475
00481 static int CclDefinePlayerColors(lua_State *l)
00482 {
00483 int i;
00484 int args;
00485 int j;
00486 int numcolors;
00487
00488 LuaCheckArgs(l, 1);
00489 if (!lua_istable(l, 1)) {
00490 LuaError(l, "incorrect argument");
00491 }
00492
00493 args = lua_objlen(l, 1);
00494 for (i = 0; i < args; ++i) {
00495 lua_rawgeti(l, 1, i + 1);
00496 PlayerColorNames[i / 2] = LuaToString(l, -1);
00497 lua_pop(l, 1);
00498 ++i;
00499 lua_rawgeti(l, 1, i + 1);
00500 if (!lua_istable(l, -1)) {
00501 LuaError(l, "incorrect argument");
00502 }
00503 numcolors = lua_objlen(l, -1);
00504 if (numcolors != PlayerColorIndexCount) {
00505 LuaError(l, "You should use %d colors (See DefinePlayerColorIndex())" _C_ PlayerColorIndexCount);
00506 }
00507 for (j = 0; j < numcolors; ++j) {
00508 lua_rawgeti(l, -1, j + 1);
00509 if (!lua_istable(l, -1) || lua_objlen(l, -1) != 3) {
00510 LuaError(l, "incorrect argument");
00511 }
00512 lua_rawgeti(l, -1, 1);
00513 lua_rawgeti(l, -2, 2);
00514 lua_rawgeti(l, -3, 3);
00515 PlayerColorsRGB[i / 2][j].r = LuaToNumber(l, -3);
00516 PlayerColorsRGB[i / 2][j].g = LuaToNumber(l, -2);
00517 PlayerColorsRGB[i / 2][j].b = LuaToNumber(l, -1);
00518 lua_pop(l, 3 + 1);
00519 }
00520 }
00521
00522 return 0;
00523 }
00524
00530 static int CclNewPlayerColors(lua_State *l)
00531 {
00532 LuaCheckArgs(l, 0);
00533 SetPlayersPalette();
00534
00535 return 0;
00536 }
00537
00543 static int CclDefinePlayerColorIndex(lua_State *l)
00544 {
00545 int i;
00546
00547 LuaCheckArgs(l, 2);
00548 PlayerColorIndexStart = LuaToNumber(l, 1);
00549 PlayerColorIndexCount = LuaToNumber(l, 2);
00550
00551 for (i = 0; i < PlayerMax; ++i) {
00552 delete[] PlayerColorsRGB[i];
00553 PlayerColorsRGB[i] = new SDL_Color[PlayerColorIndexCount];
00554 memset(PlayerColorsRGB[i], 0, PlayerColorIndexCount * sizeof(SDL_Color));
00555 delete[] PlayerColors[i];
00556 PlayerColors[i] = new Uint32[PlayerColorIndexCount];
00557 memset(PlayerColorsRGB[i], 0, PlayerColorIndexCount * sizeof(Uint32));
00558 }
00559 return 0;
00560 }
00561
00562
00563
00567 void PlayerCclRegister(void)
00568 {
00569 lua_register(Lua, "Player", CclPlayer);
00570 lua_register(Lua, "ChangeUnitsOwner", CclChangeUnitsOwner);
00571
00572 lua_register(Lua, "SetMaxSelectable", CclSetMaxSelectable);
00573
00574 lua_register(Lua, "SetAllPlayersUnitLimit",
00575 CclSetAllPlayersUnitLimit);
00576 lua_register(Lua, "SetAllPlayersBuildingLimit",
00577 CclSetAllPlayersBuildingLimit);
00578 lua_register(Lua, "SetAllPlayersTotalUnitLimit",
00579 CclSetAllPlayersTotalUnitLimit);
00580
00581 lua_register(Lua, "SetDiplomacy", CclSetDiplomacy);
00582 lua_register(Lua, "Diplomacy", CclDiplomacy);
00583 lua_register(Lua, "SetSharedVision", CclSetSharedVision);
00584 lua_register(Lua, "SharedVision", CclSharedVision);
00585
00586 lua_register(Lua, "DefinePlayerColors", CclDefinePlayerColors);
00587 lua_register(Lua, "DefinePlayerColorIndex", CclDefinePlayerColorIndex);
00588
00589 lua_register(Lua, "NewColors", CclNewPlayerColors);
00590 }
00591