param.cpp 23 KB

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