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 "stratagus.h"
00036
00037 #include <stdio.h>
00038 #include <stdlib.h>
00039 #include <string.h>
00040 #include <string>
00041 #include <vector>
00042 #include <map>
00043
00044 #include "upgrade.h"
00045 #include "player.h"
00046 #include "interface.h"
00047 #include "map.h"
00048 #include "script.h"
00049 #include "spells.h"
00050 #include "unit.h"
00051 #include "unittype.h"
00052 #include "actions.h"
00053 #include "iolib.h"
00054
00055
00056
00057
00058
00059 static void AllowUnitId(CPlayer *player, int id, int units);
00060
00061
00062
00063
00064
00070 void SaveUpgrades(CFile *file)
00071 {
00072 file->printf("\n-- -----------------------------------------\n");
00073 file->printf("-- MODULE: upgrades\n\n");
00074
00075
00076
00077
00078 for (size_t i = 0; i < UnitTypes.size(); ++i) {
00079 file->printf("DefineUnitAllow(\"%s\", ", UnitTypes[i]->Ident.c_str());
00080 for (int p = 0; p < PlayerMax; ++p) {
00081 if (p) {
00082 file->printf(", ");
00083 }
00084 file->printf("%d", Players[p].Allow.Units[i]);
00085 }
00086 file->printf(")\n");
00087 }
00088 file->printf("\n");
00089 }
00090
00091
00092
00093
00094
00098 static int CclDefineUnitAllow(lua_State *l)
00099 {
00100 const char *ident;
00101 int i;
00102 int args;
00103 int j;
00104 int id;
00105
00106 args = lua_gettop(l);
00107 j = 0;
00108 ident = LuaToString(l, j + 1);
00109 ++j;
00110
00111 if (strncmp(ident, "unit-", 5)) {
00112 DebugPrint(" wrong ident %s\n" _C_ ident);
00113 return 0;
00114 }
00115 id = UnitTypeIdByIdent(ident);
00116
00117 i = 0;
00118 for (; j < args && i < PlayerMax; ++j) {
00119 AllowUnitId(&Players[i], id, LuaToNumber(l, j + 1));
00120 ++i;
00121 }
00122
00123 return 0;
00124 }
00125
00129 static int CclDefineAllow(lua_State *l)
00130 {
00131 const char *ident;
00132 const char *ids;
00133 int n;
00134 int args;
00135 int id;
00136
00137 args = lua_gettop(l);
00138 for (int j = 0; j < args; ++j) {
00139 ident = LuaToString(l, j + 1);
00140 ++j;
00141 ids = LuaToString(l, j + 1);
00142
00143 n = strlen(ids);
00144 if (n > PlayerMax) {
00145 fprintf(stderr, "%s: Allow string too long %d\n", ident, n);
00146 n = PlayerMax;
00147 }
00148
00149 if (!strncmp(ident, "unit-", 5)) {
00150 id = UnitTypeIdByIdent(ident);
00151 for (int i = 0; i < n; ++i) {
00152 if (ids[i] == 'A') {
00153 AllowUnitId(&Players[i], id, UnitMax);
00154 } else if (ids[i] == 'F') {
00155 AllowUnitId(&Players[i], id, 0);
00156 }
00157 }
00158 } else {
00159 DebugPrint(" wrong ident %s\n" _C_ ident);
00160 }
00161 }
00162
00163 return 0;
00164 }
00165
00169 void UpgradesCclRegister(void)
00170 {
00171 lua_register(Lua, "DefineAllow", CclDefineAllow);
00172 lua_register(Lua, "DefineUnitAllow", CclDefineUnitAllow);
00173 }
00174
00175
00176
00177
00178
00179
00180
00181
00188 int UnitTypeIdByIdent(const std::string &ident)
00189 {
00190 const CUnitType *type;
00191
00192 if ((type = UnitTypeByIdent(ident))) {
00193 return type->Slot;
00194 }
00195 DebugPrint(" fix this %s\n" _C_ ident.c_str());
00196 Assert(0);
00197 return -1;
00198 }
00199
00200
00201
00202
00203
00204
00205
00213 static void AllowUnitId(CPlayer *player, int id, int units)
00214 {
00215 player->Allow.Units[id] = units;
00216 }
00217
00226 int UnitIdAllowed(const CPlayer *player, int id)
00227 {
00228 Assert(id >= 0 && id < UnitTypeMax);
00229 return player->Allow.Units[id];
00230 }
00231