resources.cpp
上传用户:maxiaolivb
上传日期:2022-06-07
资源大小:915k
文件大小:21k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.5
  3. ** Copyright (C) 2003-2004, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** hgeResourceManager resources implementation
  7. */
  8. #include "....includehgeresource.h"
  9. #include "parser.h"
  10. #include "resources.h"
  11. HGE *ResDesc::hge=0;
  12. /////////////// COMMON //
  13. void AddRes(hgeResourceManager *rm, int type, ResDesc *resource)
  14. {
  15. resource->next=rm->res[type];
  16. rm->res[type]=resource;
  17. }
  18. ResDesc *FindRes(hgeResourceManager *rm, int type, const char *name)
  19. {
  20. ResDesc *rc;
  21. rc=rm->res[type];
  22. while(rc)
  23. {
  24. if(!strcmp(name, rc->name)) return rc;
  25. rc=rc->next;
  26. }
  27. return 0;
  28. }
  29. bool ScriptSkipToNextParameter(RScriptParser *sp, bool bIgnore)
  30. {
  31. bool bToBeIgnored=bIgnore;
  32. if(bIgnore) sp->put_back();
  33. for(;;)
  34. {
  35. sp->get_token();
  36. if(sp->tokentype == TTCLOSEBLOCK) { if(bIgnore) {sp->put_back(); return true;} return false; }
  37. if((sp->tokentype > TTRES__FIRST && sp->tokentype < TTRES__LAST)  || sp->tokentype == TTEND)
  38. {
  39. sp->put_back(); 
  40. if(bIgnore) return true;
  41. sp->ScriptPostError("'}' missed, "," encountered.");
  42. return false;
  43. }
  44. if((sp->tokentype <= TTPAR__FIRST && sp->tokentype >= TTPAR__LAST) || bToBeIgnored)
  45. {
  46. bToBeIgnored=false;
  47. sp->ScriptPostError("Unsupported resource parameter ",".");
  48. do sp->get_token();
  49. while((sp->tokentype <= TTPAR__FIRST || sp->tokentype >= TTPAR__LAST) &&
  50.   (sp->tokentype <= TTRES__FIRST || sp->tokentype >= TTRES__LAST) &&
  51.    sp->tokentype != TTCLOSEBLOCK && sp->tokentype != TTEND);
  52. sp->put_back();
  53. }
  54. else
  55. {
  56. if(bIgnore) sp->put_back();
  57. return true;
  58. }
  59. }
  60. }
  61. void ScriptParseFileResource(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename, ResDesc *rr, int restype)
  62. {
  63. RResource *rc=(RResource *)rr, *base;
  64. base = (RResource *)FindRes(rm, restype, basename);
  65. if(base) *rc=*base; else rc->resgroup=0;
  66. rc->handle=0; strcpy(rc->name, name);
  67. while(ScriptSkipToNextParameter(sp,false))
  68. {
  69. switch(sp->tokentype)
  70. {
  71. case TTPAR_FILENAME:
  72. sp->get_token(); sp->get_token();
  73. strcpy(rc->filename, sp->tkn_string());
  74. break;
  75. case TTPAR_RESGROUP:
  76. sp->get_token(); sp->get_token();
  77. rc->resgroup=sp->tkn_int();
  78. break;
  79. default:
  80. ScriptSkipToNextParameter(sp,true);
  81. break;
  82. }
  83. }
  84. AddRes(rm, restype, rc);
  85. }
  86. void ScriptParseBlendMode(RScriptParser *sp, int *blend)
  87. {
  88. for(;;)
  89. {
  90. sp->get_token();
  91. if(sp->tokentype != TTEQUALS && sp->tokentype != TTSEPARATOR) { sp->put_back(); return; }
  92. switch(sp->get_token())
  93. {
  94. case TTCON_COLORMUL:
  95. *blend &= ~BLEND_COLORADD;
  96. break;
  97. case TTCON_COLORADD:
  98. *blend |= BLEND_COLORADD;
  99. break;
  100. case TTCON_ALPHABLND:
  101. *blend |= BLEND_ALPHABLEND;
  102. break;
  103. case TTCON_ALPHAADD:
  104. *blend &= ~BLEND_ALPHABLEND;
  105. break;
  106. case TTCON_ZWRITE:
  107. *blend |= BLEND_ZWRITE;
  108. break;
  109. case TTCON_NOZWRITE:
  110. *blend &= ~BLEND_ZWRITE;
  111. break;
  112. default:
  113. sp->ScriptPostError("Unsupported value ",".");
  114. break;
  115. }
  116. }
  117. }
  118. void ScriptParseSpriteAnim(RScriptParser *sp, RSprite *rc, bool anim)
  119. {
  120. while(ScriptSkipToNextParameter(sp,false))
  121. {
  122. switch(sp->tokentype)
  123. {
  124. case TTPAR_TEXTURE:
  125. sp->get_token(); sp->get_token();
  126. strcpy(rc->texname,sp->tkn_string());
  127. break;
  128. case TTPAR_RECT:
  129. sp->get_token(); sp->get_token();
  130. rc->tx=sp->tkn_float();
  131. sp->get_token(); sp->get_token();
  132. rc->ty=sp->tkn_float();
  133. sp->get_token(); sp->get_token();
  134. rc->w=sp->tkn_float();
  135. sp->get_token(); sp->get_token();
  136. rc->h=sp->tkn_float();
  137. break;
  138. case TTPAR_HOTSPOT:
  139. sp->get_token(); sp->get_token();
  140. rc->hotx=sp->tkn_float();
  141. sp->get_token(); sp->get_token();
  142. rc->hoty=sp->tkn_float();
  143. break;
  144. case TTPAR_BLENDMODE:
  145. ScriptParseBlendMode(sp, &rc->blend);
  146. break;
  147. case TTPAR_COLOR:
  148. sp->get_token(); sp->get_token();
  149. rc->color=sp->tkn_hex();
  150. break;
  151. case TTPAR_ZORDER:
  152. sp->get_token(); sp->get_token();
  153. rc->z=sp->tkn_float();
  154. break;
  155. case TTPAR_FLIP:
  156. sp->get_token(); sp->get_token();
  157. rc->bXFlip=sp->tkn_bool();
  158. sp->get_token(); sp->get_token();
  159. rc->bYFlip=sp->tkn_bool();
  160. break;
  161. case TTPAR_RESGROUP:
  162. sp->get_token(); sp->get_token();
  163. rc->resgroup=sp->tkn_int();
  164. break;
  165. case TTPAR_FRAMES:
  166. if(anim)
  167. {
  168. sp->get_token(); sp->get_token();
  169. ((RAnimation *)rc)->frames=sp->tkn_int();
  170. break;
  171. }
  172. case TTPAR_FPS:
  173. if(anim)
  174. {
  175. sp->get_token(); sp->get_token();
  176. ((RAnimation *)rc)->fps=sp->tkn_float();
  177. break;
  178. }
  179. case TTPAR_MODE:
  180. if(anim)
  181. {
  182. for(;;)
  183. {
  184. sp->get_token();
  185. if(sp->tokentype != TTEQUALS && sp->tokentype != TTSEPARATOR) { sp->put_back(); break; }
  186. switch(sp->get_token())
  187. {
  188. case TTCON_FORWARD:
  189. ((RAnimation *)rc)->mode &= ~HGEANIM_REV;
  190. break;
  191. case TTCON_REVERSE:
  192. ((RAnimation *)rc)->mode |= HGEANIM_REV;
  193. break;
  194. case TTCON_NOPINGPONG:
  195. ((RAnimation *)rc)->mode &= ~HGEANIM_PINGPONG;
  196. break;
  197. case TTCON_PINGPONG:
  198. ((RAnimation *)rc)->mode |= HGEANIM_PINGPONG;
  199. break;
  200. case TTCON_NOLOOP:
  201. ((RAnimation *)rc)->mode &= ~HGEANIM_LOOP;
  202. break;
  203. case TTCON_LOOP:
  204. ((RAnimation *)rc)->mode |= HGEANIM_LOOP;
  205. break;
  206. default:
  207. sp->ScriptPostError("Unsupported value ",".");
  208. break;
  209. }
  210. }
  211. break;
  212. }
  213. default:
  214. ScriptSkipToNextParameter(sp,true);
  215. break;
  216. }
  217. }
  218. }
  219. /////////////// RScript //
  220. void RScript::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *sname, const char *sbasename)
  221. {
  222. RScriptParser *np;
  223. RScript *res_script;
  224. void *data;
  225. DWORD size;
  226. char *script, name[MAXRESCHARS], basename[MAXRESCHARS];
  227. int restype;
  228. if(!FindRes(rm, RES_SCRIPT, sname))
  229. {
  230. res_script = new RScript(); // hack! we need an instance of RScript to access hge
  231. // if all ok, this object is used later to keep the script
  232. data=hge->Resource_Load(sname, &size);
  233. if(!data)
  234. {
  235. if(sp) sp->ScriptPostError("Script "," not found.");
  236. else hge->System_Log("Script '%s' not found.",sname);
  237. delete res_script;
  238. return;
  239. }
  240. else
  241. {
  242. script= new char[size+1];
  243. memcpy(script, data, size);
  244. script[size]=0;
  245. hge->Resource_Free(data);
  246. strcpy(res_script->name, sname);
  247. AddRes(rm, RES_SCRIPT, res_script);
  248. np = new RScriptParser(res_script->name, script);
  249. for(;;)
  250. {
  251. np->get_token();
  252. if(np->tokentype == TTEND) break;
  253. else if(np->tokentype == TTRES_INCLUDE)
  254. {
  255. np->get_token();
  256. RScript::Parse(rm, np, np->tkn_string(), NULL);
  257. }
  258. else if(np->tokentype > TTRES__FIRST && np->tokentype < TTRES__LAST)
  259. {
  260. restype=np->tokentype-TTRES__FIRST-1;
  261. name[0]=basename[0]=0;
  262. np->get_token();
  263. if(FindRes(rm, restype, np->tkn_string()))
  264. {
  265. np->ScriptPostError("Resource "," of the same type already has been defined.");
  266. while((np->tokentype <= TTRES__FIRST || np->tokentype >= TTRES__LAST) && np->tokentype != TTEND) np->get_token();
  267. np->put_back();
  268. continue;
  269. }
  270. strcpy(name, np->tkn_string());
  271. np->get_token();
  272. if(np->tokentype == TTBASED)
  273. {
  274. np->get_token();
  275. if(!FindRes(rm, restype, np->tkn_string())) np->ScriptPostError("Base resource "," is not defined.");
  276. else strcpy(basename, np->tkn_string());
  277. np->get_token();
  278. }
  279. if(np->tokentype == TTOPENBLOCK)
  280. {
  281. switch(restype)
  282. {
  283. case RES_RESOURCE: RResource::Parse(rm, np, name, basename); break;
  284. case RES_TEXTURE: RTexture::Parse(rm, np, name, basename); break;
  285. case RES_EFFECT: REffect::Parse(rm, np, name, basename); break;
  286. case RES_MUSIC: RMusic::Parse(rm, np, name, basename); break;
  287. case RES_STREAM: RStream::Parse(rm, np, name, basename); break;
  288. case RES_TARGET: RTarget::Parse(rm, np, name, basename); break;
  289. case RES_SPRITE: RSprite::Parse(rm, np, name, basename); break;
  290. case RES_ANIMATION: RAnimation::Parse(rm, np, name, basename); break;
  291. case RES_FONT: RFont::Parse(rm, np, name, basename); break;
  292. case RES_PARTICLE: RParticle::Parse(rm, np, name, basename); break;
  293. case RES_DISTORT: RDistort::Parse(rm, np, name, basename); break;
  294. case RES_STRTABLE: RStringTable::Parse(rm, np, name, basename); break;
  295. }
  296. }
  297. else
  298. {
  299. np->ScriptPostError("Illegal resource syntax, "," found; '{' expected.");
  300. while((np->tokentype <= TTRES__FIRST || np->tokentype >= TTRES__LAST) && np->tokentype != TTEND) np->get_token();
  301. np->put_back();
  302. }
  303. }
  304. else
  305. {
  306. np->ScriptPostError("Unrecognized resource specificator ",".");
  307. while((np->tokentype <= TTRES__FIRST || np->tokentype >= TTRES__LAST) && np->tokentype != TTEND) np->get_token();
  308. np->put_back();
  309. }
  310. }
  311. delete np;
  312. delete[] script;
  313. }
  314. }
  315. else sp->ScriptPostError("Script "," already has been parsed.");
  316. }
  317. /////////////// RResource //
  318. void RResource::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
  319. {
  320. ScriptParseFileResource(rm, sp, name, basename, new RResource(), RES_RESOURCE);
  321. }
  322. DWORD RResource::Get(hgeResourceManager *rm)
  323. {
  324. if(!handle) handle=(DWORD)hge->Resource_Load(filename);
  325. return handle;
  326. }
  327. void RResource::Free()
  328. {
  329. if(handle) hge->Resource_Free((void *)handle);
  330. handle=0;
  331. }
  332. /////////////// RTexture //
  333. void RTexture::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
  334. {
  335. ScriptParseFileResource(rm, sp, name, basename, new RTexture(), RES_TEXTURE);
  336. }
  337. DWORD RTexture::Get(hgeResourceManager *rm)
  338. {
  339. if(!handle) handle=(DWORD)hge->Texture_Load(filename);
  340. return handle;
  341. }
  342. void RTexture::Free()
  343. {
  344. if(handle) hge->Texture_Free((HTEXTURE)handle);
  345. handle=0;
  346. }
  347. /////////////// REffect //
  348. void REffect::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
  349. {
  350. ScriptParseFileResource(rm, sp, name, basename, new REffect(), RES_EFFECT);
  351. }
  352. DWORD REffect::Get(hgeResourceManager *rm)
  353. {
  354. if(!handle) handle=(DWORD)hge->Effect_Load(filename);
  355. return handle;
  356. }
  357. void REffect::Free()
  358. {
  359. if(handle) hge->Effect_Free((HEFFECT)handle);
  360. handle=0;
  361. }
  362. /////////////// RMusic //
  363. void RMusic::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
  364. {
  365. ScriptParseFileResource(rm, sp, name, basename, new RMusic(), RES_MUSIC);
  366. }
  367. DWORD RMusic::Get(hgeResourceManager *rm)
  368. {
  369. if(!handle) handle=(DWORD)hge->Music_Load(filename);
  370. return handle;
  371. }
  372. void RMusic::Free()
  373. {
  374. if(handle) hge->Music_Free((HMUSIC)handle);
  375. handle=0;
  376. }
  377. /////////////// RStream //
  378. void RStream::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
  379. {
  380. ScriptParseFileResource(rm, sp, name, basename, new RStream(), RES_STREAM);
  381. }
  382. DWORD RStream::Get(hgeResourceManager *rm)
  383. {
  384. if(!handle) handle=(DWORD)hge->Stream_Load(filename);
  385. return handle;
  386. }
  387. void RStream::Free()
  388. {
  389. if(handle) hge->Stream_Free((HSTREAM)handle);
  390. handle=0;
  391. }
  392. /////////////// RTarget //
  393. void RTarget::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
  394. {
  395. RTarget *rc, *base;
  396. rc = new RTarget();
  397. base = (RTarget *)FindRes(rm, RES_TARGET, basename);
  398. if(base) *rc=*base;
  399. else
  400. {
  401. rc->resgroup=0;
  402. rc->width=256;
  403. rc->height=256;
  404. rc->zbuffer=false;
  405. }
  406. rc->handle=0; strcpy(rc->name, name);
  407. while(ScriptSkipToNextParameter(sp, false))
  408. {
  409. switch(sp->tokentype)
  410. {
  411. case TTPAR_SIZE:
  412. sp->get_token(); sp->get_token();
  413. rc->width=sp->tkn_int();
  414. sp->get_token();
  415. sp->get_token();
  416. rc->height=sp->tkn_int();
  417. break;
  418. case TTPAR_ZBUFFER:
  419. sp->get_token(); sp->get_token();
  420. rc->zbuffer=sp->tkn_bool();
  421. break;
  422. case TTPAR_RESGROUP:
  423. sp->get_token(); sp->get_token();
  424. rc->resgroup=sp->tkn_int();
  425. break;
  426. default:
  427. ScriptSkipToNextParameter(sp, true);
  428. break;
  429. }
  430. }
  431. AddRes(rm, RES_TARGET, rc);
  432. }
  433. DWORD RTarget::Get(hgeResourceManager *rm)
  434. {
  435. if(!handle) handle=(DWORD)hge->Target_Create(width, height, zbuffer);
  436. return handle;
  437. }
  438. void RTarget::Free()
  439. {
  440. if(handle) hge->Target_Free((HTARGET)handle);
  441. handle=0;
  442. }
  443. /////////////// RSprite //
  444. void RSprite::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
  445. {
  446. RSprite *rc, *base;
  447. rc = new RSprite();
  448. base = (RSprite *)FindRes(rm, RES_SPRITE, basename);
  449. if(base) *rc=*base;
  450. else
  451. {
  452. rc->resgroup=0;
  453. rc->texname[0]=0;
  454. rc->tx=rc->ty=0;
  455. rc->w=rc->h=0;
  456. rc->hotx=rc->hoty=0;
  457. rc->blend=BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE;
  458. rc->color=0xFFFFFFFF;
  459. rc->z=0.5f;
  460. rc->bXFlip=false;
  461. rc->bYFlip=false;
  462. // rc->x=rc->y=0;
  463. // rc->scale=1.0f;
  464. // rc->rotation=0.0f;
  465. // rc->collision=HGECOL_RECT;
  466. }
  467. rc->handle=0;
  468. strcpy(rc->name, name);
  469. ScriptParseSpriteAnim(sp, rc, false);
  470. AddRes(rm, RES_SPRITE, rc);
  471. }
  472. DWORD RSprite::Get(hgeResourceManager *rm)
  473. {
  474. hgeSprite *spr;
  475. if(!handle)
  476. {
  477. spr = new hgeSprite(rm->GetTexture(texname), tx, ty, w, h);
  478. spr->SetColor(color);
  479. spr->SetZ(z);
  480. spr->SetBlendMode(blend);
  481. spr->SetHotSpot(hotx,hoty);
  482. spr->SetFlip(bXFlip, bYFlip);
  483. // spr->MoveTo(x,y);
  484. // spr->SetScale(scale);
  485. // spr->SetRotation(rotation);
  486. // spr->SetCollisionType(collision);
  487. handle=(DWORD)spr;
  488. }
  489. return handle;
  490. }
  491. void RSprite::Free()
  492. {
  493. if(handle) delete (hgeSprite *)handle;
  494. handle=0;
  495. }
  496. /////////////// RAnimation //
  497. void RAnimation::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
  498. {
  499. RAnimation *rc, *base;
  500. rc = new RAnimation();
  501. base = (RAnimation *)FindRes(rm, RES_ANIMATION, basename);
  502. if(base) *rc=*base;
  503. else
  504. {
  505. rc->resgroup=0;
  506. rc->texname[0]=0;
  507. rc->tx=rc->ty=0;
  508. rc->w=rc->h=0;
  509. rc->hotx=rc->hoty=0;
  510. rc->blend=BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE;
  511. rc->color=0xFFFFFFFF;
  512. rc->z=0.5f;
  513. rc->bXFlip=false;
  514. rc->bYFlip=false;
  515. // rc->x=rc->y=0;
  516. // rc->scale=1.0f;
  517. // rc->rotation=0.0f;
  518. // rc->collision=HGECOL_RECT;
  519. rc->frames=1;
  520. rc->fps=12.0f;
  521. rc->mode=HGEANIM_FWD | HGEANIM_LOOP;
  522. }
  523. rc->handle=0;
  524. strcpy(rc->name, name);
  525. ScriptParseSpriteAnim(sp, rc, true);
  526. AddRes(rm, RES_ANIMATION, rc);
  527. }
  528. DWORD RAnimation::Get(hgeResourceManager *rm)
  529. {
  530. hgeAnimation *spr;
  531. if(!handle)
  532. {
  533. spr = new hgeAnimation(rm->GetTexture(texname), frames, fps, tx, ty, w, h);
  534. spr->SetColor(color);
  535. spr->SetZ(z);
  536. spr->SetBlendMode(blend);
  537. spr->SetHotSpot(hotx,hoty);
  538. spr->SetFlip(bXFlip, bYFlip);
  539. // spr->MoveTo(x,y);
  540. // spr->SetScale(scale);
  541. // spr->SetRotation(rotation);
  542. // spr->SetCollisionType(collision);
  543. spr->SetMode(mode);
  544. handle=(DWORD)spr;
  545. }
  546. return handle;
  547. }
  548. void RAnimation::Free()
  549. {
  550. if(handle) delete (hgeAnimation *)handle;
  551. handle=0;
  552. }
  553. /////////////// RFont //
  554. void RFont::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
  555. {
  556. RFont *rc, *base;
  557. rc = new RFont();
  558. base = (RFont *)FindRes(rm, RES_FONT, basename);
  559. if(base) *rc=*base;
  560. else
  561. {
  562. rc->resgroup=0;
  563. rc->filename[0]=0;
  564. rc->blend=BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE;
  565. rc->color=0xFFFFFFFF;
  566. rc->z=0.5f;
  567. rc->scale=1.0f;
  568. rc->tracking=0.0f;
  569. rc->spacing=1.0f;
  570. rc->rotation=0.0f;
  571. }
  572. rc->handle=0; strcpy(rc->name, name);
  573. while(ScriptSkipToNextParameter(sp,false))
  574. {
  575. switch(sp->tokentype)
  576. {
  577. case TTPAR_FILENAME:
  578. sp->get_token(); sp->get_token();
  579. strcpy(rc->filename, sp->tkn_string());
  580. break;
  581. case TTPAR_BLENDMODE:
  582. ScriptParseBlendMode(sp, &rc->blend);
  583. break;
  584. case TTPAR_COLOR:
  585. sp->get_token(); sp->get_token();
  586. rc->color=sp->tkn_hex();
  587. break;
  588. case TTPAR_ZORDER:
  589. sp->get_token(); sp->get_token();
  590. rc->z=sp->tkn_float();
  591. break;
  592. case TTPAR_SCALE:
  593. sp->get_token(); sp->get_token();
  594. rc->scale=sp->tkn_float();
  595. break;
  596. case TTPAR_ROTATION:
  597. sp->get_token(); sp->get_token();
  598. rc->rotation=sp->tkn_float();
  599. break;
  600. case TTPAR_TRACKING:
  601. sp->get_token(); sp->get_token();
  602. rc->tracking=sp->tkn_float();
  603. break;
  604. case TTPAR_SPACING:
  605. sp->get_token(); sp->get_token();
  606. rc->spacing=sp->tkn_float();
  607. break;
  608. case TTPAR_RESGROUP:
  609. sp->get_token(); sp->get_token();
  610. rc->resgroup=sp->tkn_int();
  611. break;
  612. default:
  613. ScriptSkipToNextParameter(sp, true);
  614. break;
  615. }
  616. }
  617. AddRes(rm, RES_FONT, rc);
  618. }
  619. DWORD RFont::Get(hgeResourceManager *rm)
  620. {
  621. hgeFont *fnt;
  622. if(!handle)
  623. {
  624. fnt = new hgeFont(filename);
  625. fnt->SetColor(color);
  626. fnt->SetZ(z);
  627. fnt->SetBlendMode(blend);
  628. fnt->SetScale(scale);
  629. fnt->SetTracking(tracking);
  630. fnt->SetSpacing(spacing);
  631. fnt->SetRotation(rotation);
  632. handle=(DWORD)fnt;
  633. }
  634. return handle;
  635. }
  636. void RFont::Free()
  637. {
  638. if(handle) delete (hgeFont *)handle;
  639. handle=0;
  640. }
  641. /////////////// RParticle //
  642. void RParticle::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
  643. {
  644. RParticle *rc, *base;
  645. rc = new RParticle();
  646. base = (RParticle *)FindRes(rm, RES_PARTICLE, basename);
  647. if(base) *rc=*base;
  648. else
  649. {
  650. rc->resgroup=0;
  651. rc->filename[0]=0;
  652. rc->spritename[0]=0;
  653. rc->fps=50.0f;
  654. }
  655. rc->handle=0; strcpy(rc->name, name);
  656. while(ScriptSkipToNextParameter(sp, false))
  657. {
  658. switch(sp->tokentype)
  659. {
  660. case TTPAR_FILENAME:
  661. sp->get_token(); sp->get_token();
  662. strcpy(rc->filename, sp->tkn_string());
  663. break;
  664. case TTPAR_SPRITE:
  665. sp->get_token(); sp->get_token();
  666. strcpy(rc->spritename, sp->tkn_string());
  667. break;
  668. case TTPAR_FPS:
  669. sp->get_token(); sp->get_token();
  670. rc->fps=sp->tkn_float();
  671. break;
  672. case TTPAR_RESGROUP:
  673. sp->get_token(); sp->get_token();
  674. rc->resgroup=sp->tkn_int();
  675. break;
  676. default:
  677. ScriptSkipToNextParameter(sp, true);
  678. break;
  679. }
  680. }
  681. AddRes(rm, RES_PARTICLE, rc);
  682. }
  683. DWORD RParticle::Get(hgeResourceManager *rm)
  684. {
  685. hgeParticleSystem *par;
  686. if(!handle)
  687. {
  688. par = new hgeParticleSystem(filename, rm->GetSprite(spritename), fps);
  689. handle=(DWORD)par;
  690. }
  691. return handle;
  692. }
  693. void RParticle::Free()
  694. {
  695. if(handle) delete (hgeParticleSystem *)handle;
  696. handle=0;
  697. }
  698. /////////////// RDistort //
  699. void RDistort::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
  700. {
  701. RDistort *rc, *base;
  702. rc = new RDistort();
  703. base = (RDistort *)FindRes(rm, RES_DISTORT, basename);
  704. if(base) *rc=*base;
  705. else
  706. {
  707. rc->resgroup=0;
  708. rc->texname[0]=0;
  709. rc->tx=rc->ty=0;
  710. rc->w=rc->h=0;
  711. rc->cols=rc->rows=2;
  712. rc->blend=BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE;
  713. rc->color=0xFFFFFFFF;
  714. rc->z=0.5f;
  715. }
  716. rc->handle=0; strcpy(rc->name, name);
  717. while(ScriptSkipToNextParameter(sp, false))
  718. {
  719. switch(sp->tokentype)
  720. {
  721. case TTPAR_TEXTURE:
  722. sp->get_token(); sp->get_token();
  723. strcpy(rc->texname, sp->tkn_string());
  724. break;
  725. case TTPAR_RECT:
  726. sp->get_token(); sp->get_token();
  727. rc->tx=sp->tkn_float();
  728. sp->get_token(); sp->get_token();
  729. rc->ty=sp->tkn_float();
  730. sp->get_token(); sp->get_token();
  731. rc->w=sp->tkn_float();
  732. sp->get_token(); sp->get_token();
  733. rc->h=sp->tkn_float();
  734. break;
  735. case TTPAR_MESH:
  736. sp->get_token(); sp->get_token();
  737. rc->cols=sp->tkn_int();
  738. sp->get_token(); sp->get_token();
  739. rc->rows=sp->tkn_int();
  740. break;
  741. case TTPAR_BLENDMODE:
  742. ScriptParseBlendMode(sp, &rc->blend);
  743. break;
  744. case TTPAR_COLOR:
  745. sp->get_token(); sp->get_token();
  746. rc->color=sp->tkn_hex();
  747. break;
  748. case TTPAR_ZORDER:
  749. sp->get_token(); sp->get_token();
  750. rc->z=sp->tkn_float();
  751. break;
  752. case TTPAR_RESGROUP:
  753. sp->get_token(); sp->get_token();
  754. rc->resgroup=sp->tkn_int();
  755. break;
  756. default:
  757. ScriptSkipToNextParameter(sp, true);
  758. break;
  759. }
  760. }
  761. AddRes(rm, RES_DISTORT, rc);
  762. }
  763. DWORD RDistort::Get(hgeResourceManager *rm)
  764. {
  765. hgeDistortionMesh *dis;
  766. if(!handle)
  767. {
  768. dis = new hgeDistortionMesh(cols, rows);
  769. dis->SetTexture(rm->GetTexture(texname));
  770. dis->SetTextureRect(tx,ty,w,h);
  771. dis->SetBlendMode(blend);
  772. dis->Clear(color,z);
  773. handle=(DWORD)dis;
  774. }
  775. return handle;
  776. }
  777. void RDistort::Free()
  778. {
  779. if(handle) delete (hgeDistortionMesh *)handle;
  780. handle=0;
  781. }
  782. /////////////// RStringTable //
  783. void RStringTable::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
  784. {
  785. ScriptParseFileResource(rm, sp, name, basename, new RStringTable(), RES_STRTABLE);
  786. }
  787. DWORD RStringTable::Get(hgeResourceManager *rm)
  788. {
  789. if(!handle) handle = (DWORD)new hgeStringTable(filename);
  790. return handle;
  791. }
  792. void RStringTable::Free()
  793. {
  794. if(handle) delete (hgeStringTable *)handle;
  795. handle=0;
  796. }