00001
00006 #include <PalmOS.h>
00007 #include <StringMgr.h>
00008 #include <unix_string.h>
00009 #include <unix_stdlib.h>
00010 #include <StdIOPalm.h>
00011 #include <stddef.h>
00012 #include <simcity.h>
00013 #include <simcity_resconsts.h>
00014 #include <savegame.h>
00015 #include <savegame_be.h>
00016 #include <logging.h>
00017 #include <globals.h>
00018 #include <zakdef.h>
00019 #include <drawing.h>
00020 #include <build.h>
00021 #include <handler.h>
00022 #include <simulation.h>
00023 #include <resCompat.h>
00024 #include <palmutils.h>
00025 #include <repeathandler.h>
00026
00027 static void UpdateSaveGameList(void) SAVE_SECTION;
00028 static void CleanSaveGameList(void) SAVE_SECTION;
00029 static void DeleteFromList(void) SAVE_SECTION;
00030 static int LoadFromList(void) SAVE_SECTION;
00031
00032 static FormPtr filesSetup(FormPtr form) SAVE_SECTION;
00033
00034 static void cnCancelButtonPressed(void) SAVE_SECTION;
00035 static void cnCreateButtonPressed(void) SAVE_SECTION;
00036 static FormPtr cityNewSetup(FormPtr form) SAVE_SECTION;
00037 static void cnFieldContentChanged(UInt16 fieldID) SAVE_SECTION;
00038 static void cnRepeatPressed(EventPtr event) SAVE_SECTION;
00039
00040 #if defined(HRSUPPORT)
00041 static Boolean resizeSavegameForm(FormPtr form, Int16 hOff,
00042 Int16 vOff) SAVE_SECTION;
00043 #else
00044 #define resizeSavegameForm(F,H,V)
00045 #endif
00046
00048 #define LASTGAME ((UInt16)~0)
00049
00050 #define MAXSAVEGAMECOUNT 50
00051
00053 static char **citylist;
00054
00055 int
00056 UILoadAutoGame(void)
00057 {
00058 return (LoadAutoSave());
00059 }
00060
00061 void
00062 UIClearAutoSaveSlot(void)
00063 {
00064 DeleteAutoSave();
00065 }
00066
00070 void
00071 UISaveMyCity(void)
00072 {
00073 SaveGameByName((char *)game.cityname);
00074 }
00075
00079 void
00080 UISaveAutoGame(void)
00081 {
00082 SetAutoSave((char *)game.cityname);
00083 UISaveMyCity();
00084 }
00085
00089 Boolean
00090 hFilesNew(EventPtr event)
00091 {
00092 Boolean handled = false;
00093 FormPtr form;
00094 UInt16 fieldID;
00095 WChar chr;
00096
00097 switch (event->eType) {
00098 case frmOpenEvent:
00099 SetGameNotInProgress();
00100 form = FrmGetActiveForm();
00101 SetSilkResizable(form, true);
00102 collapseMove(form, CM_DEFAULT, NULL, NULL);
00103 FrmDrawForm(cityNewSetup(form));
00104 handled = true;
00105 break;
00106 case frmCloseEvent:
00107 break;
00108 case keyDownEvent:
00109 form = FrmGetActiveForm();
00110 fieldID = FrmGetObjectId(form, FrmGetFocus(form));
00111 if (fieldID < fieldID_width || fieldID > fieldID_width)
00112 break;
00113
00114 chr = event->data.keyDown.chr;
00115 if (((chr >= chrDigitZero) && (chr <= chrDigitNine)) ||
00116 (chr == chrBackspace)) {
00117 EvtEnqueueKey(chrTilde, 0, 0);
00118 break;
00119 }
00120 if (chr == chrTilde)
00121 cnFieldContentChanged(fieldID);
00122 break;
00123
00124 case ctlRepeatEvent:
00125 cnRepeatPressed(event);
00126 break;
00127 case ctlSelectEvent:
00128 switch (event->data.ctlSelect.controlID) {
00129 case buttonID_FilesNewCreate:
00130 cnCreateButtonPressed();
00131 handled = true;
00132 break;
00133 case buttonID_FilesNewCancel:
00134 cnCancelButtonPressed();
00135 handled = true;
00136 break;
00137 }
00138 break;
00139 #if defined(HRSUPPORT)
00140 case winDisplayChangedEvent:
00141 #if defined(SONY_CLIE)
00142 case vchrSilkResize:
00143 #endif
00144 form = FrmGetActiveForm();
00145 if (collapseMove(form, CM_DEFAULT, NULL, NULL)) {
00146 FrmEraseForm(form);
00147 FrmDrawForm(form);
00148 }
00149 handled = true;
00150 break;
00151 #endif
00152 default:
00153 break;
00154 }
00155
00156 return (handled);
00157 }
00158
00162 static buttonmapping_t mapsize_map[] = {
00163 { rbutton_widthdown, rbutton_widthup, fieldID_width, 50, 120, 0, 0 },
00164 { rbutton_heightdown, rbutton_heightup, fieldID_height, 50, 120, 0, 0 },
00165 { 0, 0, 0, 0, 0, 0, 0 }
00166 };
00167
00172 static void
00173 cnRepeatPressed(EventPtr event)
00174 {
00175 UInt16 control = event->data.ctlRepeat.controlID;
00176 (void) processRepeater(mapsize_map, control, true, NULL);
00177 }
00178
00183 static void
00184 cnFieldContentChanged(UInt16 fieldID)
00185 {
00186 (void) processRepeater(mapsize_map, fieldID, false, NULL);
00187 }
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 static void
00198 cnCancelButtonPressed(void)
00199 {
00200 game.cityname[0] = '\0';
00201 FrmReturnToForm(0);
00202 }
00203
00207 static void
00208 cnCreateButtonPressed(void)
00209 {
00210 char *pGameName;
00211 FormPtr form;
00212 UInt8 level = 0;
00213 UInt8 width;
00214 UInt8 height;
00215 FieldPtr fp;
00216 MemHandle mh;
00217 MemPtr mp;
00218
00219 InitGameStruct();
00220
00221 form = FrmGetActiveForm();
00222 if (FrmGetControlValue(form, FrmGetObjectIndex(form, buttonID_Easy)))
00223 level = 0;
00224 if (FrmGetControlValue(form, FrmGetObjectIndex(form, buttonID_Medium)))
00225 level = 1;
00226 if (FrmGetControlValue(form, FrmGetObjectIndex(form, buttonID_Hard)))
00227 level = 2;
00228 setDifficultyLevel(level);
00229
00230 if (FrmGetControlValue(form, FrmGetObjectIndex(form,
00231 buttonID_dis_off)))
00232 level = 0;
00233 if (FrmGetControlValue(form, FrmGetObjectIndex(form,
00234 buttonID_dis_one)))
00235 level = 1;
00236 if (FrmGetControlValue(form, FrmGetObjectIndex(form,
00237 buttonID_dis_two)))
00238 level = 2;
00239 if (FrmGetControlValue(form, FrmGetObjectIndex(form,
00240 buttonID_dis_three)))
00241 level = 3;
00242 setDisasterLevel(level);
00243
00244 fp = (FieldPtr)GetObjectPtr(form, fieldID_width);
00245 mh = FldGetTextHandle(fp);
00246 mp = MemHandleLock(mh);
00247 width = (UInt8)StrAToI(mp);
00248 MemHandleUnlock(mh);
00249 fp = (FieldPtr)GetObjectPtr(form, fieldID_height);
00250 mh = FldGetTextHandle(fp);
00251 mp = MemHandleLock(mh);
00252 height = (UInt8)StrAToI(mp);
00253 MemHandleUnlock(mh);
00254 setMapSize(width, height);
00255 ConfigureNewGame();
00256
00257 pGameName = FldGetTextPtr((FieldPtr)GetObjectPtr(form,
00258 fieldID_newGameName));
00259 if (pGameName != NULL) {
00260 MemSet(game.cityname, CITYNAMELEN, '\0');
00261 StrNCopy((char *)game.cityname, pGameName, CITYNAMELEN);
00262 while (GameExists((char *)game.cityname)) {
00263 UInt16 slen = StrLen((char *)game.cityname);
00264 if (slen < CITYNAMELEN-1) {
00265 game.cityname[slen-1] = '0' - 1;
00266 game.cityname[slen] = '\0';
00267 slen++;
00268 }
00269 game.cityname[slen - 1]++;
00270 }
00271 SaveGameByName((char *)game.cityname);
00272 CleanSaveGameList();
00273 if (LoadGameByName((char *)game.cityname) != -1) {
00274 FrmEraseForm(form);
00275 form = FrmGetFormPtr(formID_files);
00276 if (form != NULL) {
00277 FrmEraseForm(form);
00278 FrmDeleteForm(form);
00279 }
00280 FrmGotoForm(formID_pocketCity);
00281 } else {
00282 UpdateSaveGameList();
00283 }
00284 } else {
00285 game.cityname[0] = '\0';
00286 WriteLog("No name specified\n");
00287 }
00288 }
00289
00295 static FormPtr
00296 cityNewSetup(FormPtr form)
00297 {
00298 int i;
00299 MemHandle hText;
00300 MemPtr pText;
00301
00302 FrmSetFocus(form, FrmGetObjectIndex(form, fieldID_newGameName));
00303 FrmSetControlValue(form, FrmGetObjectIndex(form, buttonID_Easy), 1);
00304 FrmSetControlValue(form, FrmGetObjectIndex(form, buttonID_dis_one), 1);
00305
00306 for (i = 0; i < 2; i++) {
00307 hText = MemHandleNew(5);
00308 pText = MemHandleLock(hText);
00309 StrPrintF((char *)pText, "%u", 100);
00310 MemHandleUnlock(hText);
00311 FldSetTextHandle((FieldPtr)GetObjectPtr(form,
00312 (UInt16)(fieldID_width + i)), hText);
00313 }
00314
00315 return (form);
00316 }
00317
00322 Boolean
00323 hFiles(EventPtr event)
00324 {
00325 Boolean handled = false;
00326 FormPtr form;
00327 #if defined(HRSUPPORT)
00328 Int16 hOff = 0, vOff = 0;
00329 #endif
00330
00331 switch (event->eType) {
00332 case frmOpenEvent:
00333 form = FrmGetActiveForm();
00334 SetSilkResizable(form, true);
00335 collapseMove(form, CM_DEFAULT, &hOff, &vOff);
00336 resizeSavegameForm(form, hOff, vOff);
00337 filesSetup(form);
00338 FrmDrawForm(form);
00339 handled = true;
00340 break;
00341 case frmCloseEvent:
00342 CleanSaveGameList();
00343 SetSilkResizable(NULL, false);
00344 break;
00345 case ctlSelectEvent:
00346 switch (event->data.ctlSelect.controlID) {
00347 case buttonID_FilesNew:
00348
00349 FrmPopupForm(formID_filesNew);
00350 handled = true;
00351 break;
00352 case buttonID_FilesLoad:
00353
00354 if (LoadFromList() != -1)
00355 FrmGotoForm(formID_pocketCity);
00356 handled = true;
00357 break;
00358 case buttonID_FilesDelete:
00359 DeleteFromList();
00360 CleanSaveGameList();
00361 UpdateSaveGameList();
00362 handled = true;
00363 break;
00364 }
00365 break;
00366 #if defined(HRSUPPORT)
00367 case winDisplayChangedEvent:
00368 #if defined(SONY_CLIE)
00369 case vchrSilkResize:
00370 #endif
00371 form = FrmGetActiveForm();
00372 if (collapseMove(form, CM_DEFAULT, &hOff, &vOff)) {
00373 resizeSavegameForm(form, hOff, vOff);
00374 FrmDrawForm(form);
00375 }
00376 handled = true;
00377 break;
00378 #endif
00379 default:
00380 break;
00381 }
00382
00383 return (handled);
00384 }
00385
00391 static FormPtr
00392 filesSetup(FormPtr form)
00393 {
00394 SetGameNotInProgress();
00395 UpdateSaveGameList();
00396
00397 return (form);
00398 }
00399
00400 #if defined(HRSUPPORT)
00401
00410 static Boolean
00411 resizeSavegameForm(FormPtr form, Int16 hOff, Int16 vOff)
00412 {
00413 if (!(hOff || vOff))
00414 return (false);
00415
00416 RearrangeObjectOnly(form, listID_FilesList, 0, 0, hOff, vOff);
00417 RearrangeObjectOnly(form, buttonID_FilesNew, 0, vOff, 0, 0);
00418 RearrangeObjectOnly(form, buttonID_FilesLoad, 0, vOff, 0, 0);
00419 RearrangeObjectOnly(form, buttonID_FilesDelete, 0, vOff, 0, 0);
00420 return (true);
00421 }
00422
00423 #endif
00424
00432 static void
00433 UpdateSaveGameList(void)
00434 {
00435 int count;
00436 FormPtr files_form;
00437 ListPtr list;
00438
00439 if (citylist != NULL)
00440 FreeCityNames(citylist);
00441
00442 citylist = CityNames(&count);
00443
00444 files_form = FrmGetFormPtr((UInt16)formID_files);
00445
00446 if (files_form == NULL) {
00447 WriteLog("could not get the files form pointer\n");
00448 return;
00449 }
00450 list = (ListPtr)GetObjectPtr(files_form, listID_FilesList);
00451
00452 if (list == NULL) {
00453 WriteLog("Could not get the pointer for list\n");
00454 return;
00455 }
00456
00457 if (NULL == citylist) {
00458 LstSetListChoices(list, NULL, 0);
00459 if (files_form == FrmGetActiveForm() && FrmVisible(files_form))
00460 LstDrawList(list);
00461 return;
00462 }
00463
00464
00465 LstSetListChoices(list, citylist, count);
00466 if (files_form == FrmGetActiveForm() && FrmVisible(files_form))
00467 LstDrawList(list);
00468 }
00469
00476 static void
00477 CleanSaveGameList(void)
00478 {
00479 ListPtr listp;
00480 FormPtr form = FrmGetFormPtr(formID_files);
00481
00482 if (form == NULL)
00483 return;
00484 listp = (ListPtr)GetObjectPtr(form, listID_FilesList);
00485 if (listp == NULL)
00486 return;
00487
00488 LstSetListChoices(listp, NULL, 0);
00489
00490 FreeCityNames(citylist);
00491 citylist = NULL;
00492 }
00493
00500 static int
00501 LoadFromList(void)
00502 {
00503 FormPtr form = FrmGetFormPtr(formID_files);
00504 ListPtr listp;
00505 int index;
00506
00507 listp = (ListPtr)GetObjectPtr(form, listID_FilesList);
00508 index = LstGetSelection(listp);
00509 if (index >= 0) {
00510 char *text = LstGetSelectionText(listp, index);
00511 return (LoadGameByName(text));
00512 } else {
00513 return (-1);
00514 }
00515 }
00516
00523 static void
00524 DeleteFromList(void)
00525 {
00526 FormPtr form = FrmGetFormPtr(formID_files);
00527 ListPtr listp;
00528 Int16 index;
00529
00530 listp = (ListPtr)GetObjectPtr(form, listID_FilesList);
00531 index = LstGetSelection(listp);
00532 if (index != noListSelection) {
00533 char *name;
00534 name = LstGetSelectionText(listp, index);
00535 DeleteGameByName(name);
00536 }
00537 }