resources.cpp
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:23k
源码类别:

游戏引擎

开发平台:

Visual C++

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