param.cpp 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316
  1. /* $Id$
  2. * MegaZeux
  3. *
  4. * Copyright (C) 1996 Greg Janson
  5. * Copyright (C) 1998 Matthew D. Williams - dbwilli@scsn.net
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License as
  9. * published by the Free Software Foundation; either version 2 of
  10. * the License, or (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. /* PARAM.CPP- Millions of dialog boxes for inputting parameters of
  22. a specified id. If a parameter is already available,
  23. it is edited. Special functions are called in other
  24. files for robots, scrolls, and signs. */
  25. #include <string.h>
  26. #include "helpsys.h"
  27. #include "graphics.h"
  28. #include "intake.h"
  29. #include "scrdisp.h"
  30. #include "error.h"
  31. #include "param.h"
  32. #include "window.h"
  33. #include "data.h"
  34. #include "edit.h"
  35. #include "robot.h"
  36. #include "robo_ed.h"
  37. #include "rasm.h"
  38. #include "event.h"
  39. // Default parameters (-2 = 0 and no edit, -3 = character, -4 = board)
  40. int def_params[128] =
  41. {
  42. -2, -2, -2, -2, -2, -3, -2, -3, -2, -2, -3, -2, -3, -2, -2, -2, // 0x00 - 0x0F
  43. -2, -3, -2, -2, -2, -2, -2, -2, -2, -2, -2, 0, -2, -2, 10, 0, // 0x10 - 0x1F
  44. 0, -2, -2, 5, 0,128, 32, -2, -2, 0, -2, -4, -4, -2, -2, 0, // 0x20 - 0x2F
  45. -2, 0, -2, -3, -3, -3, -3, 17, 0, -2, -2, -2, 0, 4, 0, -2, // 0x30 - 0x3F
  46. -2, -2, -2, -4, -4, -4, -4, -2, 0, -2, 48, 0, -3, -3, 0,127, // 0x40 - 0x4F
  47. 32, 26, 2, 1, 0, 2, 65, 2, 66, 2,129, 34, 66, 66, 12, 10, // 0x50 - 0x5F
  48. -2,194, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, // 0x60 - 0x6F
  49. -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 0, 0, 0, 0, 0, -2 // 0x70 - 0x7F
  50. };
  51. // Returns parameter or -1 for ESC. Must pass a legit parameter, or -1 to
  52. // use default or load up a new robot/scroll/sign.
  53. int edit_param(World *mzx_world, int id, int param)
  54. {
  55. if(def_params[id] == -2)
  56. {
  57. // No editing allowed
  58. // If has a param, return it, otherwise return 0
  59. if(param > -1)
  60. return param;
  61. return 0;
  62. }
  63. if(def_params[id] == -3)
  64. {
  65. int new_param;
  66. // Character
  67. if(param < 0)
  68. param = 177;
  69. new_param = char_selection(param);
  70. if(new_param < 0)
  71. new_param = param;
  72. return new_param;
  73. }
  74. if(def_params[id] == -4)
  75. {
  76. int new_param;
  77. // Board
  78. if(param < 0)
  79. param = 0;
  80. new_param = choose_board(mzx_world, param,
  81. "Choose destination board", 0);
  82. if(new_param < 0)
  83. new_param = param;
  84. return new_param;
  85. }
  86. if(param < 0)
  87. param = def_params[id];
  88. // Switch according to thing
  89. switch(id)
  90. {
  91. case 27: // Chest
  92. {
  93. param = pe_chest(mzx_world, param);
  94. break;
  95. }
  96. case 30: // Health
  97. case 35: // Ammo
  98. {
  99. param = pe_health(mzx_world, param);
  100. break;
  101. }
  102. case 31: // Ring
  103. case 32: // Potion
  104. {
  105. param = pe_ring(mzx_world, param);
  106. break;
  107. }
  108. case 36: // Bomb
  109. {
  110. param = pe_bomb(mzx_world, param);
  111. break;
  112. }
  113. case 37: // Lit bomb
  114. {
  115. param = pe_lit_bomb(mzx_world, param);
  116. break;
  117. }
  118. case 38: // Explosion
  119. {
  120. param = pe_explosion(mzx_world, param);
  121. break;
  122. }
  123. case 41: // Door
  124. {
  125. param = pe_door(mzx_world, param);
  126. break;
  127. }
  128. case 47: // Gate
  129. {
  130. param = pe_gate(mzx_world, param);
  131. break;
  132. }
  133. case 49: // Transport
  134. {
  135. param = pe_transport(mzx_world, param);
  136. break;
  137. }
  138. case 55: // Pouch
  139. {
  140. param = pe_pouch(mzx_world, param);
  141. break;
  142. }
  143. case 56: // Pusher
  144. case 62: // Missile
  145. case 75: // Spike
  146. {
  147. param = pe_pusher(mzx_world, param);
  148. break;
  149. }
  150. case 78: // Shooting fire
  151. {
  152. param = pe_pusher(mzx_world, param >> 1) << 1;
  153. break;
  154. }
  155. case 60: // Lazer gun
  156. {
  157. param = pe_lazer_gun(mzx_world, param);
  158. break;
  159. }
  160. case 61: // Bullet
  161. {
  162. param = pe_bullet(mzx_world, param);
  163. break;
  164. }
  165. case 72: // Ricochet panel
  166. {
  167. param = pe_ricochet_panel(mzx_world, param);
  168. break;
  169. }
  170. case 74: // Mine
  171. {
  172. param = pe_mine(mzx_world, param);
  173. break;
  174. }
  175. case 80: // Snake
  176. {
  177. param = pe_snake(mzx_world, param);
  178. break;
  179. }
  180. case 81: // Eye
  181. {
  182. param = pe_eye(mzx_world, param);
  183. break;
  184. }
  185. case 82: // Thief
  186. {
  187. param = pe_thief(mzx_world, param);
  188. break;
  189. }
  190. case 83: // Slime blob
  191. {
  192. param = pe_slime_blob(mzx_world, param);
  193. break;
  194. }
  195. case 84: // Runner
  196. {
  197. param = pe_runner(mzx_world, param);
  198. break;
  199. }
  200. case 85: // Ghost
  201. {
  202. param = pe_ghost(mzx_world, param);
  203. break;
  204. }
  205. case 86: // Dragon
  206. {
  207. param = pe_dragon(mzx_world, param);
  208. break;
  209. }
  210. case 87: // Fish
  211. {
  212. param = pe_fish(mzx_world, param);
  213. break;
  214. }
  215. case 88: // Shark
  216. case 91: // Spitting tiger
  217. {
  218. param = pe_shark(mzx_world, param);
  219. break;
  220. }
  221. case 89: // Spider
  222. {
  223. param = pe_spider(mzx_world, param);
  224. break;
  225. }
  226. case 90: // Goblin
  227. {
  228. param = pe_goblin(mzx_world, param);
  229. break;
  230. }
  231. case 92: // Bullet gun
  232. case 93: // Spinning gun
  233. {
  234. param = pe_bullet_gun(mzx_world, param);
  235. break;
  236. }
  237. case 94: // Bear
  238. {
  239. param = pe_bear(mzx_world, param);
  240. break;
  241. }
  242. case 95: // Bear cub
  243. {
  244. param = pe_bear_cub(mzx_world, param);
  245. break;
  246. }
  247. case 97: // Missile gun
  248. {
  249. param = pe_missile_gun(mzx_world, param);
  250. break;
  251. }
  252. }
  253. // Return param
  254. return param;
  255. }
  256. // Communial dialog
  257. #define MAX_ELEMS 6
  258. char di_types[MAX_ELEMS] = { DE_BUTTON, DE_BUTTON };
  259. char di_xs[MAX_ELEMS] = { 15, 37 };
  260. char di_ys[MAX_ELEMS] = { 15, 15 };
  261. char *di_strs[MAX_ELEMS] = { "OK", "Cancel" };
  262. int di_p1s[MAX_ELEMS] = { 0, -1 };
  263. int di_p2s[MAX_ELEMS] = { 0, 0 };
  264. void *di_storage[MAX_ELEMS] = { NULL, NULL };
  265. dialog di =
  266. {
  267. 10, 5, 69, 22, "Choose settings", 3, di_types, di_xs, di_ys,
  268. di_strs, di_p1s, di_p2s, di_storage, 2
  269. };
  270. // Internal- Reset dialog to above settings
  271. void reset_di(void)
  272. {
  273. int i;
  274. for(i = 2; i < MAX_ELEMS; i++)
  275. {
  276. di_types[i] = 0;
  277. di_xs[i] = 0;
  278. di_ys[i] = 0;
  279. di_p1s[i] = 0;
  280. di_p2s[i] = 0;
  281. di_strs[i] = NULL;
  282. di_storage[i] = NULL;
  283. }
  284. di.curr_element = 2;
  285. di.num_elements = 3;
  286. }
  287. #define do_dialog() run_dialog(mzx_world, &di, 0, 2)
  288. char *potion_fx =
  289. "No Effect \0"
  290. "Invinco \0"
  291. "Blast \0"
  292. "Health x10 \0"
  293. "Health x50 \0"
  294. "Poison \0"
  295. "Blind \0"
  296. "Kill Enemies\0"
  297. "Lava Walker \0"
  298. "Detonate \0"
  299. "Banish \0"
  300. "Summon \0"
  301. "Avalanche \0"
  302. "Freeze Time \0"
  303. "Wind \0"
  304. "Slow Time";
  305. int pe_chest(World *mzx_world, int param)
  306. {
  307. int type = param & 0x0F;
  308. int var = param >> 4;
  309. // First, pick chest contents
  310. type = list_menu
  311. (
  312. "Empty \0"
  313. "Key \0"
  314. "Coins \0"
  315. "Lives \0"
  316. "Ammo \0"
  317. "Gems \0"
  318. "Health \0"
  319. "Potion \0"
  320. "Ring \0"
  321. "Lo Bombs\0"
  322. "Hi Bombs", 9, "Choose chest contents", type, 11, 33
  323. );
  324. if(type < 0)
  325. return -1;
  326. switch(type)
  327. {
  328. case 0: // Empty
  329. {
  330. var = 0;
  331. break;
  332. }
  333. case 1: // Key
  334. {
  335. var = color_selection(var, 0);
  336. if(var > 0)
  337. var = var & 0x0F;
  338. break;
  339. }
  340. case 7:
  341. case 8: // Ring/potion
  342. {
  343. var = list_menu(potion_fx, 13, "Choose effect", var, 16, 31);
  344. break;
  345. }
  346. default: // Number
  347. {
  348. reset_di();
  349. if(type == 3)
  350. di_types[2] = DE_NUMBER;
  351. else
  352. di_types[2] = DE_FIVE;
  353. di_xs[2] = 5;
  354. di_ys[2] = 6;
  355. if(type == 3)
  356. di_strs[2] = "Number of lives: ";
  357. else
  358. di_strs[2] = "Amount (multiple of five): ";
  359. di_p1s[2] = 0;
  360. di_p2s[2] = 15;
  361. di_storage[2] = &var;
  362. if(do_dialog())
  363. var = -1;
  364. break;
  365. }
  366. }
  367. if(var < 0)
  368. return -1;
  369. return (var << 4) | type;
  370. }
  371. int pe_health(World *mzx_world, int param)
  372. {
  373. reset_di();
  374. di_types[2] = DE_NUMBER;
  375. di_xs[2] = 15;
  376. di_ys[2] = 6;
  377. di_strs[2] = "Amount: ";
  378. di_p1s[2] = 0;
  379. di_p2s[2] = 255;
  380. di_storage[2] = &param;
  381. if(do_dialog())
  382. return -1;
  383. return param;
  384. }
  385. int pe_ring(World *mzx_world, int param)
  386. {
  387. return list_menu(potion_fx, 13, "Choose effect", param, 16, 31);
  388. }
  389. int pe_bomb(World *mzx_world, int param)
  390. {
  391. int rad = param;
  392. reset_di();
  393. di_types[2] = DE_RADIO;
  394. di_xs[2] = 15;
  395. di_ys[2] = 6;
  396. di_strs[2] = "Low strength bomb\nHigh strength bomb";
  397. di_p1s[2] = 2;
  398. di_p2s[2] = 18;
  399. di_storage[2] = &rad;
  400. if(do_dialog())
  401. return -1;
  402. return rad;
  403. }
  404. int pe_lit_bomb(World *mzx_world, int param)
  405. {
  406. int rad = param >> 7;
  407. int stage = 7 - (param & 0x3F);
  408. reset_di();
  409. di_types[2] = DE_RADIO;
  410. di_xs[2] = 15;
  411. di_ys[2] = 6;
  412. di_strs[2] = "Low strength bomb\nHigh strength bomb";
  413. di_p1s[2] = 2;
  414. di_p2s[2] = 18;
  415. di_storage[2] = &rad;
  416. di_types[3] = DE_NUMBER;
  417. di_xs[3] = 15;
  418. di_ys[3] = 9;
  419. di_strs[3] = "Fuse length: ";
  420. di_p1s[3] = 1;
  421. di_p2s[3] = 7;
  422. di_storage[3] = &stage;
  423. di.num_elements = 4;
  424. if(do_dialog())
  425. return -1;
  426. return (rad << 7) | (7 - stage);
  427. }
  428. int pe_explosion(World *mzx_world, int param)
  429. {
  430. int size = param >> 4;
  431. int stage = (param & 0x0F) + 1;
  432. reset_di();
  433. di_types[2] = DE_NUMBER;
  434. di_xs[2] = 15;
  435. di_ys[2] = 6;
  436. di_strs[2] = "Explosion stage: ";
  437. di_p1s[2] = 1;
  438. di_p2s[2] = 4;
  439. di_storage[2] = &stage;
  440. di_types[3] = DE_NUMBER;
  441. di_xs[3] = 15;
  442. di_ys[3] = 8;
  443. di_strs[3] = "Explosion size: ";
  444. di_p1s[3] = 0;
  445. di_p2s[3] = 15;
  446. di_storage[3] = &size;
  447. di.num_elements = 4;
  448. if(do_dialog())
  449. return -1;
  450. return (size << 4) | (stage - 1);
  451. }
  452. int pe_door(World *mzx_world, int param)
  453. {
  454. int hv = param&1;
  455. int opens = (param >> 1) & 0x03;
  456. int locked = param >> 3;
  457. reset_di();
  458. di_types[2] = DE_RADIO;
  459. di_xs[2] = 15;
  460. di_ys[2] = 3;
  461. di_strs[2] = "Horizontal\nVertical";
  462. di_p1s[2] = 2;
  463. di_p2s[2] = 18;
  464. di_storage[2] = &hv;
  465. di_types[3] = DE_RADIO;
  466. di_xs[3] = 15;
  467. di_ys[3] = 6;
  468. di_strs[3] = "Opens N/W\nOpens N/E\nOpens S/W\nOpens S/E";
  469. di_p1s[3] = 4;
  470. di_p2s[3] = 9;
  471. di_storage[3] = &opens;
  472. di_types[4] = DE_CHECK;
  473. di_xs[4] = 15;
  474. di_ys[4] = 11;
  475. di_strs[4] = "Locked door";
  476. di_p1s[4] = 1;
  477. di_p2s[4] = 11;
  478. di_storage[4] = &locked;
  479. di.num_elements = 5;
  480. if(do_dialog())
  481. return -1;
  482. return hv | (opens << 1) | (locked << 3);
  483. }
  484. int pe_gate(World *mzx_world, int param)
  485. {
  486. int locked = param;
  487. reset_di();
  488. di_types[2] = DE_CHECK;
  489. di_xs[2] = 15;
  490. di_ys[2] = 7;
  491. di_strs[2] = "Locked gate";
  492. di_p1s[2] = 1;
  493. di_p2s[2] = 11;
  494. di_storage[2] = &locked;
  495. if(do_dialog())
  496. return -1;
  497. return locked;
  498. }
  499. int pe_transport(World *mzx_world, int param)
  500. {
  501. reset_di();
  502. di_types[2] = DE_RADIO;
  503. di_xs[2] = 15;
  504. di_ys[2] = 6;
  505. di_strs[2] = "North\nSouth\nEast\nWest\nAll";
  506. di_p1s[2] = 5;
  507. di_p2s[2] = 5;
  508. di_storage[2] = &param;
  509. if(do_dialog())
  510. return -1;
  511. return param;
  512. }
  513. int pe_pouch(World *mzx_world, int param)
  514. {
  515. int coins = param >> 4;
  516. int gems = param & 0x0F;
  517. reset_di();
  518. di_types[2] = DE_FIVE;
  519. di_xs[2] = 6;
  520. di_ys[2] = 6;
  521. di_strs[2] = "Number of gems (mult. of 5): ";
  522. di_p1s[2] = 0;
  523. di_p2s[2] = 15;
  524. di_storage[2] = &gems;
  525. di_types[3] = DE_FIVE;
  526. di_xs[3] = 6;
  527. di_ys[3] = 8;
  528. di_strs[3] = "Number of coins (mult. of 5): ";
  529. di_p1s[3] = 0;
  530. di_p2s[3] = 15;
  531. di_storage[3] = &coins;
  532. di.num_elements = 4;
  533. if(do_dialog())
  534. return -1;
  535. return(coins << 4) | gems;
  536. }
  537. int pe_pusher(World *mzx_world, int param)
  538. {
  539. reset_di();
  540. di_types[2] = DE_RADIO;
  541. di_xs[2] = 15;
  542. di_ys[2] = 6;
  543. di_strs[2] = "North\nSouth\nEast\nWest";
  544. di_p1s[2] = 4;
  545. di_p2s[2] = 5;
  546. di_storage[2] = &param;
  547. if(do_dialog())
  548. return -1;
  549. return param;
  550. }
  551. int pe_lazer_gun(World *mzx_world, int param)
  552. {
  553. int dir = param & 0x03;
  554. int start = ((param >> 2) & 0x07) + 1;
  555. int end = (param >> 5) + 1;
  556. reset_di();
  557. di_types[2] = DE_RADIO;
  558. di_xs[2] = 15;
  559. di_ys[2] = 4;
  560. di_strs[2] = "North\nSouth\nEast\nWest";
  561. di_p1s[2] = 4;
  562. di_p2s[2] = 5;
  563. di_storage[2] = &dir;
  564. di_types[3] = DE_NUMBER;
  565. di_xs[3] = 15;
  566. di_ys[3] = 9;
  567. di_strs[3] = "Start time: ";
  568. di_p1s[3] = 1;
  569. di_p2s[3] = 8;
  570. di_storage[3] = &start;
  571. di_types[4] = DE_NUMBER;
  572. di_xs[4] = 15;
  573. di_ys[4] = 11;
  574. di_strs[4] = "Length on: ";
  575. di_p1s[4] = 1;
  576. di_p2s[4] = 7;
  577. di_storage[4] = &end;
  578. di.num_elements = 5;
  579. if(do_dialog())
  580. return -1;
  581. return dir | ((start - 1) << 2) + ((end - 1) << 5);
  582. }
  583. int pe_bullet(World *mzx_world, int param)
  584. {
  585. int dir = param & 0x03;
  586. int type = param >> 2;
  587. reset_di();
  588. di_types[2] = DE_RADIO;
  589. di_xs[2] = 15;
  590. di_ys[2] = 5;
  591. di_strs[2] = "North\nSouth\nEast\nWest";
  592. di_p1s[2] = 4;
  593. di_p2s[2] = 5;
  594. di_storage[2] = &dir;
  595. di_types[3] = DE_RADIO;
  596. di_xs[3] = 15;
  597. di_ys[3] = 10;
  598. di_strs[3] = "Player\nNeutral\nEnemy";
  599. di_p1s[3] = 3;
  600. di_p2s[3] = 7;
  601. di_storage[3] = &type;
  602. di.num_elements = 4;
  603. if(do_dialog())
  604. return -1;
  605. return dir | (type << 2);
  606. }
  607. int pe_ricochet_panel(World *mzx_world, int param)
  608. {
  609. reset_di();
  610. di_types[2] = DE_RADIO;
  611. di_xs[2] = 15;
  612. di_ys[2] = 7;
  613. di_strs[2] = "Orientation \\\nOrientation /";
  614. di_p1s[2] = 2;
  615. di_p2s[2] = 13;
  616. di_storage[2] = &param;
  617. if(do_dialog())
  618. return -1;
  619. return param;
  620. }
  621. int pe_mine(World *mzx_world, int param)
  622. {
  623. param >>= 4;
  624. param--;
  625. reset_di();
  626. di_types[2] = DE_NUMBER;
  627. di_xs[2] = 15;
  628. di_ys[2] = 7;
  629. di_strs[2] = "Blast radius: ";
  630. di_p1s[2] = 1;
  631. di_p2s[2] = 8;
  632. di_storage[2] = &param;
  633. if(do_dialog())
  634. return -1;
  635. return (param - 1) << 4;
  636. }
  637. int pe_snake(World *mzx_world, int param)
  638. {
  639. int dir = param & 0x3;
  640. int intel = (param >> 4) + 1;
  641. int speed = ((param >> 2) & 1) ^ 1;
  642. reset_di();
  643. di_types[2] = DE_RADIO;
  644. di_xs[2] = 15;
  645. di_ys[2] = 4;
  646. di_strs[2] = "North\nSouth\nEast\nWest";
  647. di_p1s[2] = 4;
  648. di_p2s[2] = 5;
  649. di_storage[2] = &dir;
  650. di_types[3] = DE_NUMBER;
  651. di_xs[3] = 15;
  652. di_ys[3] = 9;
  653. di_strs[3] = "Intellegence: ";
  654. di_p1s[3] = 1;
  655. di_p2s[3] = 8;
  656. di_storage[3] = &intel;
  657. di_types[4] = DE_CHECK;
  658. di_xs[4] = 15;
  659. di_ys[4] = 11;
  660. di_strs[4] = "Fast movement";
  661. di_p1s[4] = 1;
  662. di_p2s[4] = 13;
  663. di_storage[4] = &speed;
  664. di.num_elements = 5;
  665. if(do_dialog())
  666. return -1;
  667. return dir | ((speed ^ 1) << 2) | ((intel - 1) << 4);
  668. }
  669. int pe_eye(World *mzx_world, int param)
  670. {
  671. int intel = (param & 0x07) + 1;
  672. int radius = ((param >> 3) & 0x07) + 1;
  673. int speed = (param >> 6) ^ 1;
  674. reset_di();
  675. di_types[2] = DE_NUMBER;
  676. di_xs[2] = 15;
  677. di_ys[2] = 6;
  678. di_strs[2] = "Intellegence: ";
  679. di_p1s[2] = 1;
  680. di_p2s[2] = 8;
  681. di_storage[2] = &intel;
  682. di_types[3] = DE_NUMBER;
  683. di_xs[3] = 15;
  684. di_ys[3] = 8;
  685. di_strs[3] = "Blast radius: ";
  686. di_p1s[3] = 1;
  687. di_p2s[3] = 8;
  688. di_storage[3] = &radius;
  689. di_types[4] = DE_CHECK;
  690. di_xs[4] = 15;
  691. di_ys[4] = 10;
  692. di_strs[4] = "Fast movement";
  693. di_p1s[4] = 1;
  694. di_p2s[4] = 13;
  695. di_storage[4] = &speed;
  696. di.num_elements = 5;
  697. if(do_dialog())
  698. return -1;
  699. return (intel - 1) | ((radius - 1) << 3) | ((speed ^ 1) << 6);
  700. }
  701. int pe_thief(World *mzx_world, int param)
  702. {
  703. int intel = (param & 0x07) + 1;
  704. int speed = ((param >> 3) & 0x03) + 1;
  705. int gems = (param >> 7) + 1;
  706. reset_di();
  707. di_types[2] = DE_NUMBER;
  708. di_xs[2] = 15;
  709. di_ys[2] = 6;
  710. di_strs[2] = "Intellegence: ";
  711. di_p1s[2] = 1;
  712. di_p2s[2] = 8;
  713. di_storage[2] = &intel;
  714. di_types[3] = DE_NUMBER;
  715. di_xs[3] = 15;
  716. di_ys[3] = 8;
  717. di_strs[3] = "Movement speed: ";
  718. di_p1s[3] = 1;
  719. di_p2s[3] = 4;
  720. di_storage[3] = &speed;
  721. di_types[4] = DE_NUMBER;
  722. di_xs[4] = 15;
  723. di_ys[4] = 10;
  724. di_strs[4] = "Gems stolen: ";
  725. di_p1s[4] = 1;
  726. di_p2s[4] = 2;
  727. di_storage[4] = &gems;
  728. di.num_elements = 5;
  729. if(do_dialog())
  730. return -1;
  731. return (intel - 1) | ((speed - 1) << 3) | ((gems - 1) << 7);
  732. }
  733. int pe_slime_blob(World *mzx_world, int param)
  734. {
  735. int speed = (param & 0x07) + 1;
  736. char chk[2] = { (param >> 6) & 0x01, (param >> 7) & 0x01 };
  737. reset_di();
  738. di_types[2] = DE_NUMBER;
  739. di_xs[2] = 15;
  740. di_ys[2] = 6;
  741. di_strs[2] = "Spread speed: ";
  742. di_p1s[2] = 1;
  743. di_p2s[2] = 8;
  744. di_storage[2] = &speed;
  745. di_types[3] = DE_CHECK;
  746. di_xs[3] = 15;
  747. di_ys[3] = 8;
  748. di_strs[3] = "Hurts player\nInvincible";
  749. di_p1s[3] = 2;
  750. di_p2s[3] = 12;
  751. di_storage[3] = chk;
  752. di.num_elements = 4;
  753. if(do_dialog())
  754. return -1;
  755. return (speed - 1) | (chk[0] << 6) | (chk[1] << 7);
  756. }
  757. int pe_runner(World *mzx_world, int param)
  758. {
  759. int dir = param & 0x03;
  760. int hp = (param >> 6) + 1;
  761. int speed = ((param >> 2) & 3) + 1;
  762. reset_di();
  763. di_types[2] = DE_RADIO;
  764. di_xs[2] = 15;
  765. di_ys[2] = 4;
  766. di_strs[2] = "North\nSouth\nEast\nWest";
  767. di_p1s[2] = 4;
  768. di_p2s[2] = 5;
  769. di_storage[2] = &dir;
  770. di_types[3] = DE_NUMBER;
  771. di_xs[3] = 15;
  772. di_ys[3] = 9;
  773. di_strs[3] = "Hit points:\t";
  774. di_p1s[3] = 1;
  775. di_p2s[3] = 4;
  776. di_storage[3] = &hp;
  777. di_types[4] = DE_NUMBER;
  778. di_xs[4] = 15;
  779. di_ys[4] = 11;
  780. di_strs[4] = "Movement speed: ";
  781. di_p1s[4] = 1;
  782. di_p2s[4] = 4;
  783. di_storage[4] = &speed;
  784. di.num_elements = 5;
  785. if(do_dialog())
  786. return -1;
  787. return dir | ((speed - 1) << 2) | ((hp - 1) << 6);
  788. }
  789. int pe_ghost(World *mzx_world, int param)
  790. {
  791. int intel = (param & 0x07) + 1;
  792. int speed = ((param >> 4) & 0x03) + 1;
  793. int invinco = ((param >> 3) & 0x01);
  794. reset_di();
  795. di_types[2] = DE_NUMBER;
  796. di_xs[2] = 15;
  797. di_ys[2] = 6;
  798. di_strs[2] = "Intellegence: ";
  799. di_p1s[2] = 1;
  800. di_p2s[2] = 8;
  801. di_storage[2] = &intel;
  802. di_types[3] = DE_NUMBER;
  803. di_xs[3] = 15;
  804. di_ys[3] = 8;
  805. di_strs[3] = "Movement speed: ";
  806. di_p1s[3] = 1;
  807. di_p2s[3] = 4;
  808. di_storage[3] = &speed;
  809. di_types[4] = DE_CHECK;
  810. di_xs[4] = 15;
  811. di_ys[4] = 10;
  812. di_strs[4] = "Invincible";
  813. di_p1s[4] = 1;
  814. di_p2s[4] = 10;
  815. di_storage[4] = &invinco;
  816. di.num_elements = 5;
  817. if(do_dialog())
  818. return -1;
  819. return (intel - 1) | ((speed - 1) << 4) | (invinco << 3);
  820. }
  821. int pe_dragon(World *mzx_world, int param)
  822. {
  823. int fire_rate = (param & 0x03) + 1;
  824. int hp = ((param >> 5) & 0x03) + 1;
  825. int moves = ((param >> 2) & 0x01);
  826. reset_di();
  827. di_types[2] = DE_NUMBER;
  828. di_xs[2] = 15;
  829. di_ys[2] = 6;
  830. di_strs[2] = "Firing rate: ";
  831. di_p1s[2] = 1;
  832. di_p2s[2] = 4;
  833. di_storage[2] = &fire_rate;
  834. di_types[3] = DE_NUMBER;
  835. di_xs[3] = 15;
  836. di_ys[3] = 8;
  837. di_strs[3] = "Hit points: ";
  838. di_p1s[3] = 1;
  839. di_p2s[3] = 8;
  840. di_storage[3] = &hp;
  841. di_types[4] = DE_CHECK;
  842. di_xs[4] = 15;
  843. di_ys[4] = 10;
  844. di_strs[4] = "Moves";
  845. di_p1s[4] = 1;
  846. di_p2s[4] = 5;
  847. di_storage[4] = &moves;
  848. di.num_elements = 5;
  849. if(do_dialog())
  850. return -1;
  851. return (fire_rate - 1) | ((hp - 1) << 5) | (moves << 2);
  852. }
  853. int pe_fish(World *mzx_world, int param)
  854. {
  855. int intel = (param & 0x07) + 1;
  856. char chk[4] =
  857. {
  858. (param >> 6) & 0x01, (param >> 5) & 0x01,
  859. (param >> 7) & 0x01, ((param >> 3) & 0x01) ^ 1
  860. };
  861. reset_di();
  862. di_types[2] = DE_NUMBER;
  863. di_xs[2] = 15;
  864. di_ys[2] = 5;
  865. di_strs[2] = "Intellegence: ";
  866. di_p1s[2] = 1;
  867. di_p2s[2] = 8;
  868. di_storage[2] = &intel;
  869. di_types[3] = DE_CHECK;
  870. di_xs[3] = 15;
  871. di_ys[3] = 7;
  872. di_strs[3] = "Hurts player\nAffected by current\n2 hit points\nFast movement";
  873. di_p1s[3] = 4;
  874. di_p2s[3] = 19;
  875. di_storage[3] = chk;
  876. di.num_elements = 4;
  877. if(do_dialog())
  878. return -1;
  879. return (intel - 1) | (chk[0] << 6) | (chk[1] << 5) |
  880. (chk[2] << 7) | ((chk[3] ^1) << 3);
  881. }
  882. int pe_shark(World *mzx_world, int param)
  883. {
  884. int intel = (param & 0x03) + 1;
  885. int fire_rate = ((param >> 5) & 0x03) + 1;
  886. int fires = ((param >> 3) & 0x03);
  887. reset_di();
  888. di_types[2] = DE_NUMBER;
  889. di_xs[2] = 15;
  890. di_ys[2] = 4;
  891. di_strs[2] = "Intellegence: ";
  892. di_p1s[2] = 1;
  893. di_p2s[2] = 8;
  894. di_storage[2] = &intel;
  895. di_types[3] = DE_NUMBER;
  896. di_xs[3] = 15;
  897. di_ys[3] = 6;
  898. di_strs[3] = "Firing rate: ";
  899. di_p1s[3] = 1;
  900. di_p2s[3] = 8;
  901. di_storage[3] = &fire_rate;
  902. di_types[4] = DE_RADIO;
  903. di_xs[4] = 15;
  904. di_ys[4] = 8;
  905. di_strs[4] = "Fires bullets\nFires seekers\nFires fire\nFires nothing";
  906. di_p1s[4] = 4;
  907. di_p2s[4] = 13;
  908. di_storage[4] = &fires;
  909. di.num_elements = 5;
  910. if(do_dialog())
  911. return -1;
  912. return (intel - 1) | ((fire_rate - 1) << 5) | (fires << 3);
  913. }
  914. int pe_spider(World *mzx_world, int param)
  915. {
  916. int intel = (param & 0x03) + 1;
  917. int web = ((param >> 3) & 0x03);
  918. char chk[2] = { ((param >> 5) & 0x01) ^ 1, ((param >> 7) & 0x01) };
  919. reset_di();
  920. di_types[2] = DE_NUMBER;
  921. di_xs[2] = 15;
  922. di_ys[2] = 3;
  923. di_strs[2] = "Intellegence: ";
  924. di_p1s[2] = 1;
  925. di_p2s[2] = 8;
  926. di_storage[2] = &intel;
  927. di_types[3] = DE_RADIO;
  928. di_xs[3] = 15;
  929. di_ys[3] = 5;
  930. di_strs[3] = "Thin web only\nThick web only\nAny web\nAnywhere";
  931. di_p1s[3] = 4;
  932. di_p2s[3] = 14;
  933. di_storage[3] = &web;
  934. di_types[4] = DE_CHECK;
  935. di_xs[4] = 15;
  936. di_ys[4] = 10;
  937. di_strs[4] = "Fast movement\n2 hit points\n";
  938. di_p1s[4] = 2;
  939. di_p2s[4] = 13;
  940. di_storage[4] = chk;
  941. di.num_elements = 5;
  942. if(do_dialog())
  943. return -1;
  944. return (intel - 1) | (web << 3) | ((chk[0] ^ 1) << 5) | (chk[1] << 7);
  945. }
  946. int pe_goblin(World *mzx_world, int param)
  947. {
  948. int intel = ((param >> 6) & 0x03) + 1;
  949. int rest_len = (param & 0x03) + 1;
  950. reset_di();
  951. di_types[2] = DE_NUMBER;
  952. di_xs[2] = 15;
  953. di_ys[2] = 7;
  954. di_strs[2] = "Intellegence: ";
  955. di_p1s[2] = 1;
  956. di_p2s[2] = 4;
  957. di_storage[2] = &intel;
  958. di_types[3] = DE_NUMBER;
  959. di_xs[3] = 15;
  960. di_ys[3] = 9;
  961. di_strs[3] = "Rest length: ";
  962. di_p1s[3] = 1;
  963. di_p2s[3] = 4;
  964. di_storage[3] = &rest_len;
  965. di.num_elements = 4;
  966. if(do_dialog())
  967. return -1;
  968. return (rest_len - 1) | ((intel - 1) << 6);
  969. }
  970. int pe_bullet_gun(World *mzx_world, int param)
  971. {
  972. int dir = (param >> 3) & 0x03;
  973. int intel = ((param >> 5) & 0x03) + 1;
  974. int fire_rate = (param & 0x07) + 1;
  975. int type = (param >> 7);
  976. reset_di();
  977. di_types[2] = DE_RADIO;
  978. di_xs[2] = 15;
  979. di_ys[2] = 2;
  980. di_strs[2] = "North\nSouth\nEast\nWest";
  981. di_p1s[2] = 4;
  982. di_p2s[2] = 5;
  983. di_storage[2] = &dir;
  984. di_types[3] = DE_NUMBER;
  985. di_xs[3] = 15;
  986. di_ys[3] = 7;
  987. di_strs[3] = "Intellegence: ";
  988. di_p1s[3] = 1;
  989. di_p2s[3] = 4;
  990. di_storage[3] = &intel;
  991. di_types[4] = DE_NUMBER;
  992. di_xs[4] = 15;
  993. di_ys[4] = 9;
  994. di_strs[4] = "Firing rate: ";
  995. di_p1s[4] = 1;
  996. di_p2s[4] = 8;
  997. di_storage[4] = &fire_rate;
  998. di_types[5] = DE_RADIO;
  999. di_xs[5] = 15;
  1000. di_ys[5] = 11;
  1001. di_strs[5] = "Fires bullets\nFires fire";
  1002. di_p1s[5] = 2;
  1003. di_p2s[5] = 13;
  1004. di_storage[5] = &type;
  1005. di.num_elements = 6;
  1006. if(do_dialog())
  1007. return -1;
  1008. return (fire_rate - 1) | (dir << 3) + ((intel - 1) << 5) + (type << 7);
  1009. }
  1010. int pe_bear(World *mzx_world, int param)
  1011. {
  1012. int sens = (param & 0x07) + 1;
  1013. int speed = ((param >> 3) & 0x03) + 1;
  1014. int hp = (param >> 7);
  1015. reset_di();
  1016. di_types[2] = DE_NUMBER;
  1017. di_xs[2] = 15;
  1018. di_ys[2] = 6;
  1019. di_strs[2] = "Sensitivity: ";
  1020. di_p1s[2] = 1;
  1021. di_p2s[2] = 8;
  1022. di_storage[2] = &sens;
  1023. di_types[3] = DE_NUMBER;
  1024. di_xs[3] = 15;
  1025. di_ys[3] = 8;
  1026. di_strs[3] = "Movement speed: ";
  1027. di_p1s[3] = 1;
  1028. di_p2s[3] = 4;
  1029. di_storage[3] = &speed;
  1030. di_types[4] = DE_CHECK;
  1031. di_xs[4] = 15;
  1032. di_ys[4] = 10;
  1033. di_strs[4] = "2 hit points";
  1034. di_p1s[4] = 1;
  1035. di_p2s[4] = 12;
  1036. di_storage[4] = &hp;
  1037. di.num_elements = 5;
  1038. if(do_dialog())
  1039. return -1;
  1040. return (sens - 1) | ((speed - 1) << 3) | (hp << 7);
  1041. }
  1042. int pe_bear_cub(World *mzx_world, int param)
  1043. {
  1044. int intel = (param & 0x03) + 1;
  1045. int switch_rate = ((param >> 2) & 0x03) + 1;
  1046. reset_di();
  1047. di_types[2] = DE_NUMBER;
  1048. di_xs[2] = 15;
  1049. di_ys[2] = 7;
  1050. di_strs[2] = "Intellegence: ";
  1051. di_p1s[2] = 1;
  1052. di_p2s[2] = 4;
  1053. di_storage[2] = &intel;
  1054. di_types[3] = DE_NUMBER;
  1055. di_xs[3] = 15;
  1056. di_ys[3] = 9;
  1057. di_strs[3] = "Switch rate: ";
  1058. di_p1s[3] = 1;
  1059. di_p2s[3] = 4;
  1060. di_storage[3] = &switch_rate;
  1061. di.num_elements = 4;
  1062. if(do_dialog())
  1063. return -1;
  1064. return (intel - 1) | ((switch_rate - 1) << 2);
  1065. }
  1066. int pe_missile_gun(World *mzx_world, int param)
  1067. {
  1068. int dir = (param >> 3) & 0x03;
  1069. int intel = ((param >> 5) & 0x03) + 1;
  1070. int fire_rate = (param & 0x07) + 1;
  1071. int type = (param >> 7);
  1072. reset_di();
  1073. di_types[2] = DE_RADIO;
  1074. di_xs[2] = 15;
  1075. di_ys[2] = 2;
  1076. di_strs[2] = "North\nSouth\nEast\nWest";
  1077. di_p1s[2] = 4;
  1078. di_p2s[2] = 5;
  1079. di_storage[2] = &dir;
  1080. di_types[3] = DE_NUMBER;
  1081. di_xs[3] = 15;
  1082. di_ys[3] = 7;
  1083. di_strs[3] = "Intellegence: ";
  1084. di_p1s[3] = 1;
  1085. di_p2s[3] = 4;
  1086. di_storage[3] = &intel;
  1087. di_types[4] = DE_NUMBER;
  1088. di_xs[4] = 15;
  1089. di_ys[4] = 9;
  1090. di_strs[4] = "Firing rate: ";
  1091. di_p1s[4] = 1;
  1092. di_p2s[4] = 8;
  1093. di_storage[4] = &fire_rate;
  1094. di_types[5] = DE_RADIO;
  1095. di_xs[5] = 15;
  1096. di_ys[5] = 11;
  1097. di_strs[5] = "Fires once\nFires multiple";
  1098. di_p1s[5] = 2;
  1099. di_p2s[5] = 14;
  1100. di_storage[5] = &type;
  1101. di.num_elements = 6;
  1102. if(do_dialog())
  1103. return -1;
  1104. return (fire_rate - 1) | (dir << 3) | ((intel - 1) << 5) | (type << 7);
  1105. }
  1106. int edit_sensor(World *mzx_world, Sensor *cur_sensor)
  1107. {
  1108. char sensor_name[15];
  1109. char sensor_robot[15];
  1110. char sensor_char = cur_sensor->sensor_char;
  1111. set_context(94);
  1112. strcpy(sensor_name, cur_sensor->sensor_name);
  1113. strcpy(sensor_robot, cur_sensor->robot_to_mesg);
  1114. reset_di();
  1115. di_types[2] = DE_INPUT;
  1116. di_xs[2] = 15;
  1117. di_ys[2] = 6;
  1118. di_strs[2] = "Sensor's name: ";
  1119. di_p1s[2] = 14;
  1120. di_storage[2] = sensor_name;
  1121. di_types[3] = DE_INPUT;
  1122. di_xs[3] = 15;
  1123. di_ys[3] = 8;
  1124. di_strs[3] = "Robot to message: ";
  1125. di_p1s[3] = 14;
  1126. di_storage[3] = sensor_robot;
  1127. di_types[4] = DE_CHAR;
  1128. di_xs[4] = 15;
  1129. di_ys[4] = 10;
  1130. di_strs[4] = "Sensor character: ";
  1131. di_p1s[4] = 1;
  1132. di_storage[4] = &sensor_char;
  1133. di.num_elements = 5;
  1134. if(do_dialog())
  1135. {
  1136. pop_context();
  1137. return -1;
  1138. }
  1139. strcpy(cur_sensor->sensor_name, sensor_name);
  1140. strcpy(cur_sensor->robot_to_mesg, sensor_robot);
  1141. cur_sensor->sensor_char = sensor_char;
  1142. pop_context();
  1143. return 0;
  1144. }
  1145. int edit_scroll(World *mzx_world, Scroll *cur_scroll)
  1146. {
  1147. scroll_edit(mzx_world, cur_scroll, 2);
  1148. return 0;
  1149. }
  1150. int edit_robot(World *mzx_world, Robot *cur_robot)
  1151. {
  1152. int new_char;
  1153. // First get name...
  1154. m_hide();
  1155. save_screen();
  1156. draw_window_box(16, 12, 50, 14, EC_DEBUG_BOX, EC_DEBUG_BOX_DARK,
  1157. EC_DEBUG_BOX_CORNER, 1, 1);
  1158. write_string("Name for robot:", 18, 13, EC_DEBUG_LABEL, 0);
  1159. m_show();
  1160. if(intake(cur_robot->robot_name, 14, 34, 13, 15, 1, 0) != SDLK_ESCAPE)
  1161. {
  1162. restore_screen();
  1163. save_screen();
  1164. // ...and character.
  1165. new_char = char_selection(cur_robot->robot_char);
  1166. if(new_char < 0)
  1167. {
  1168. // ESC means keep char but don't edit robot
  1169. if(new_char == -256)
  1170. new_char = 0;
  1171. cur_robot->robot_char = -new_char;
  1172. }
  1173. else
  1174. {
  1175. cur_robot->robot_char = new_char;
  1176. // Now edit the program.
  1177. set_context(87);
  1178. robot_editor(mzx_world, cur_robot);
  1179. }
  1180. }
  1181. else
  1182. {
  1183. pop_context();
  1184. restore_screen();
  1185. return -1;
  1186. }
  1187. pop_context();
  1188. restore_screen();
  1189. return 0;
  1190. }