aboutsummaryrefslogtreecommitdiff
path: root/archive/hgehelp/resources.cpp
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2015-10-26 22:52:36 +0800
committerGravatar Chris Xiong <chirs241097@gmail.com> 2015-10-26 22:52:36 +0800
commit3bd383baf6a17e734329e1fc677c7e86283db772 (patch)
tree69a9148087577f797624ceb9c71323a2563d6bb4 /archive/hgehelp/resources.cpp
parent543e4f570be9b279ba558ca61cc02cda251af384 (diff)
downloadbullet-lab-remix-3bd383baf6a17e734329e1fc677c7e86283db772.tar.xz
Added support for relative line numbers.
Added instructions for, brk and cont. (They are still untested...) Parser code cleanup. Removed garbage output to stderr. Reorganize the repository structure. Updated BLR2 code move it into archive. Added BLR1 files.
Diffstat (limited to 'archive/hgehelp/resources.cpp')
-rw-r--r--archive/hgehelp/resources.cpp958
1 files changed, 958 insertions, 0 deletions
diff --git a/archive/hgehelp/resources.cpp b/archive/hgehelp/resources.cpp
new file mode 100644
index 0000000..33afcaa
--- /dev/null
+++ b/archive/hgehelp/resources.cpp
@@ -0,0 +1,958 @@
+/*
+** Haaf's Game Engine 1.7
+** Copyright (C) 2003-2007, Relish Games
+** hge.relishgames.com
+**
+** hgeResourceManager resources implementation
+*/
+
+
+#include "hgeresource.h"
+#include "parser.h"
+#include "resources.h"
+
+
+HGE *ResDesc::hge=0;
+
+
+/////////////// COMMON //
+
+void AddRes(hgeResourceManager *rm, int type, ResDesc *resource)
+{
+ resource->next=rm->res[type];
+ rm->res[type]=resource;
+}
+
+ResDesc *FindRes(hgeResourceManager *rm, int type, const char *name)
+{
+ ResDesc *rc;
+
+ rc=rm->res[type];
+ while(rc)
+ {
+ if(!strcmp(name, rc->name)) return rc;
+ rc=rc->next;
+ }
+
+ return 0;
+}
+
+bool ScriptSkipToNextParameter(RScriptParser *sp, bool bIgnore)
+{
+ bool bToBeIgnored=bIgnore;
+ if(bIgnore) sp->put_back();
+
+ for(;;)
+ {
+ sp->get_token();
+ if(sp->tokentype == TTCLOSEBLOCK) { if(bIgnore) {sp->put_back(); return true;} return false; }
+ if((sp->tokentype > TTRES__FIRST && sp->tokentype < TTRES__LAST) || sp->tokentype == TTEND)
+ {
+ sp->put_back();
+ if(bIgnore) return true;
+ sp->ScriptPostError("'}' missed, "," encountered.");
+ return false;
+ }
+ if((sp->tokentype <= TTPAR__FIRST && sp->tokentype >= TTPAR__LAST) || bToBeIgnored)
+ {
+ bToBeIgnored=false;
+ sp->ScriptPostError("Unsupported resource parameter ",".");
+ do sp->get_token();
+ while((sp->tokentype <= TTPAR__FIRST || sp->tokentype >= TTPAR__LAST) &&
+ (sp->tokentype <= TTRES__FIRST || sp->tokentype >= TTRES__LAST) &&
+ sp->tokentype != TTCLOSEBLOCK && sp->tokentype != TTEND);
+ sp->put_back();
+ }
+ else
+ {
+ if(bIgnore) sp->put_back();
+ return true;
+ }
+ }
+}
+
+void ScriptParseFileResource(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename, ResDesc *rr, int restype)
+{
+ RResource *rc=(RResource *)rr, *base;
+
+ base = (RResource *)FindRes(rm, restype, basename);
+ if(base) *rc=*base; else
+ {
+ rc->resgroup=0;
+ rc->filename[0]=0;
+ }
+ rc->handle=0; strcpy(rc->name, name);
+
+ while(ScriptSkipToNextParameter(sp,false))
+ {
+ switch(sp->tokentype)
+ {
+ case TTPAR_FILENAME:
+ sp->get_token(); sp->get_token();
+ strcpy(rc->filename, sp->tkn_string());
+ break;
+
+ case TTPAR_RESGROUP:
+ sp->get_token(); sp->get_token();
+ rc->resgroup=sp->tkn_int();
+ break;
+
+ default:
+ ScriptSkipToNextParameter(sp,true);
+ break;
+ }
+ }
+
+ AddRes(rm, restype, rc);
+}
+
+void ScriptParseBlendMode(RScriptParser *sp, int *blend)
+{
+ for(;;)
+ {
+ sp->get_token();
+ if(sp->tokentype != TTEQUALS && sp->tokentype != TTSEPARATOR) { sp->put_back(); return; }
+
+ switch(sp->get_token())
+ {
+ case TTCON_COLORMUL:
+ *blend &= ~BLEND_COLORADD;
+ break;
+
+ case TTCON_COLORADD:
+ *blend |= BLEND_COLORADD;
+ break;
+
+ case TTCON_ALPHABLND:
+ *blend |= BLEND_ALPHABLEND;
+ break;
+
+ case TTCON_ALPHAADD:
+ *blend &= ~BLEND_ALPHABLEND;
+ break;
+
+ case TTCON_ZWRITE:
+ *blend |= BLEND_ZWRITE;
+ break;
+
+ case TTCON_NOZWRITE:
+ *blend &= ~BLEND_ZWRITE;
+ break;
+
+ default:
+ sp->ScriptPostError("Unsupported value ",".");
+ break;
+ }
+ }
+}
+
+void ScriptParseSpriteAnim(RScriptParser *sp, RSprite *rc, bool anim)
+{
+ while(ScriptSkipToNextParameter(sp,false))
+ {
+ switch(sp->tokentype)
+ {
+ case TTPAR_TEXTURE:
+ sp->get_token(); sp->get_token();
+ strcpy(rc->texname,sp->tkn_string());
+ break;
+
+ case TTPAR_RECT:
+ sp->get_token(); sp->get_token();
+ rc->tx=sp->tkn_float();
+ sp->get_token(); sp->get_token();
+ rc->ty=sp->tkn_float();
+ sp->get_token(); sp->get_token();
+ rc->w=sp->tkn_float();
+ sp->get_token(); sp->get_token();
+ rc->h=sp->tkn_float();
+ break;
+
+ case TTPAR_HOTSPOT:
+ sp->get_token(); sp->get_token();
+ rc->hotx=sp->tkn_float();
+ sp->get_token(); sp->get_token();
+ rc->hoty=sp->tkn_float();
+ break;
+
+ case TTPAR_BLENDMODE:
+ ScriptParseBlendMode(sp, &rc->blend);
+ break;
+
+ case TTPAR_COLOR:
+ sp->get_token(); sp->get_token();
+ rc->color=sp->tkn_hex();
+ break;
+
+ case TTPAR_ZORDER:
+ sp->get_token(); sp->get_token();
+ rc->z=sp->tkn_float();
+ break;
+
+ case TTPAR_FLIP:
+ sp->get_token(); sp->get_token();
+ rc->bXFlip=sp->tkn_bool();
+ sp->get_token(); sp->get_token();
+ rc->bYFlip=sp->tkn_bool();
+ break;
+
+ case TTPAR_RESGROUP:
+ sp->get_token(); sp->get_token();
+ rc->resgroup=sp->tkn_int();
+ break;
+
+ case TTPAR_FRAMES:
+ if(anim)
+ {
+ sp->get_token(); sp->get_token();
+ ((RAnimation *)rc)->frames=sp->tkn_int();
+ break;
+ }
+
+ case TTPAR_FPS:
+ if(anim)
+ {
+ sp->get_token(); sp->get_token();
+ ((RAnimation *)rc)->fps=sp->tkn_float();
+ break;
+ }
+
+ case TTPAR_MODE:
+ if(anim)
+ {
+ for(;;)
+ {
+ sp->get_token();
+ if(sp->tokentype != TTEQUALS && sp->tokentype != TTSEPARATOR) { sp->put_back(); break; }
+
+ switch(sp->get_token())
+ {
+ case TTCON_FORWARD:
+ ((RAnimation *)rc)->mode &= ~HGEANIM_REV;
+ break;
+
+ case TTCON_REVERSE:
+ ((RAnimation *)rc)->mode |= HGEANIM_REV;
+ break;
+
+ case TTCON_NOPINGPONG:
+ ((RAnimation *)rc)->mode &= ~HGEANIM_PINGPONG;
+ break;
+
+ case TTCON_PINGPONG:
+ ((RAnimation *)rc)->mode |= HGEANIM_PINGPONG;
+ break;
+
+ case TTCON_NOLOOP:
+ ((RAnimation *)rc)->mode &= ~HGEANIM_LOOP;
+ break;
+
+ case TTCON_LOOP:
+ ((RAnimation *)rc)->mode |= HGEANIM_LOOP;
+ break;
+
+ default:
+ sp->ScriptPostError("Unsupported value ",".");
+ break;
+ }
+ }
+ break;
+ }
+
+ default:
+ ScriptSkipToNextParameter(sp,true);
+ break;
+ }
+ }
+}
+
+
+/////////////// RScript //
+
+void RScript::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *sname, const char *sbasename)
+{
+ RScriptParser *np;
+ RScript *res_script;
+ void *data;
+ DWORD size;
+ char *script, name[MAXRESCHARS], basename[MAXRESCHARS];
+ int restype;
+
+ if(!FindRes(rm, RES_SCRIPT, sname))
+ {
+ res_script = new RScript(); // hack! we need an instance of RScript to access hge
+ // if all ok, this object is used later to keep the script
+
+ data=hge->Resource_Load(sname, &size);
+ if(!data)
+ {
+ if(sp) sp->ScriptPostError("Script "," not found.");
+ else hge->System_Log("Script '%s' not found.",sname);
+ delete res_script;
+ return;
+ }
+ else
+ {
+ script= new char[size+1];
+ memcpy(script, data, size);
+ script[size]=0;
+ hge->Resource_Free(data);
+
+ strcpy(res_script->name, sname);
+ AddRes(rm, RES_SCRIPT, res_script);
+ np = new RScriptParser(res_script->name, script);
+
+ for(;;)
+ {
+ np->get_token();
+ if(np->tokentype == TTEND) break;
+
+ else if(np->tokentype == TTRES_INCLUDE)
+ {
+ np->get_token();
+ RScript::Parse(rm, np, np->tkn_string(), NULL);
+ }
+
+ else if(np->tokentype > TTRES__FIRST && np->tokentype < TTRES__LAST)
+ {
+ restype=np->tokentype-TTRES__FIRST-1;
+ name[0]=basename[0]=0;
+
+ np->get_token();
+ if(FindRes(rm, restype, np->tkn_string()))
+ {
+ np->ScriptPostError("Resource "," of the same type already has been defined.");
+ while((np->tokentype <= TTRES__FIRST || np->tokentype >= TTRES__LAST) && np->tokentype != TTEND) np->get_token();
+ np->put_back();
+ continue;
+ }
+ strcpy(name, np->tkn_string());
+
+ np->get_token();
+
+ if(np->tokentype == TTBASED)
+ {
+ np->get_token();
+ if(!FindRes(rm, restype, np->tkn_string())) np->ScriptPostError("Base resource "," is not defined.");
+ else strcpy(basename, np->tkn_string());
+ np->get_token();
+ }
+
+ if(np->tokentype == TTOPENBLOCK)
+ {
+ switch(restype)
+ {
+ case RES_RESOURCE: RResource::Parse(rm, np, name, basename); break;
+ case RES_TEXTURE: RTexture::Parse(rm, np, name, basename); break;
+ case RES_EFFECT: REffect::Parse(rm, np, name, basename); break;
+ case RES_TARGET: RTarget::Parse(rm, np, name, basename); break;
+ case RES_SPRITE: RSprite::Parse(rm, np, name, basename); break;
+ case RES_ANIMATION: RAnimation::Parse(rm, np, name, basename); break;
+ case RES_FONT: RFont::Parse(rm, np, name, basename); break;
+ case RES_PARTICLE: RParticle::Parse(rm, np, name, basename); break;
+ case RES_DISTORT: RDistort::Parse(rm, np, name, basename); break;
+ case RES_STRTABLE: RStringTable::Parse(rm, np, name, basename); break;
+ }
+ }
+ else
+ {
+ np->ScriptPostError("Illegal resource syntax, "," found; '{' expected.");
+ while((np->tokentype <= TTRES__FIRST || np->tokentype >= TTRES__LAST) && np->tokentype != TTEND) np->get_token();
+ np->put_back();
+ }
+ }
+
+ else
+ {
+ np->ScriptPostError("Unrecognized resource specificator ",".");
+ while((np->tokentype <= TTRES__FIRST || np->tokentype >= TTRES__LAST) && np->tokentype != TTEND) np->get_token();
+ np->put_back();
+ }
+ }
+
+ delete np;
+ delete[] script;
+ }
+ }
+ else sp->ScriptPostError("Script "," already has been parsed.");
+}
+
+/////////////// RResource //
+
+void RResource::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
+{
+ ScriptParseFileResource(rm, sp, name, basename, new RResource(), RES_RESOURCE);
+}
+
+DWORD RResource::Get(hgeResourceManager *rm)
+{
+ if(!handle) handle=(size_t)hge->Resource_Load(filename);
+ return handle;
+}
+
+void RResource::Free()
+{
+ if(handle) hge->Resource_Free((void *)handle);
+ handle=0;
+}
+
+/////////////// RTexture //
+
+void RTexture::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
+{
+ RTexture *rc, *base;
+
+ rc=new RTexture();
+ base = (RTexture *)FindRes(rm, RES_TEXTURE, basename);
+ if(base) *rc=*base;
+ else
+ {
+ rc->resgroup=0;
+ rc->mipmap=false;
+ }
+ rc->handle=0; strcpy(rc->name, name);
+
+ while(ScriptSkipToNextParameter(sp,false))
+ {
+ switch(sp->tokentype)
+ {
+ case TTPAR_FILENAME:
+ sp->get_token(); sp->get_token();
+ strcpy(rc->filename, sp->tkn_string());
+ break;
+
+ case TTPAR_RESGROUP:
+ sp->get_token(); sp->get_token();
+ rc->resgroup=sp->tkn_int();
+ break;
+
+ case TTPAR_MIPMAP:
+ sp->get_token(); sp->get_token();
+ rc->mipmap=sp->tkn_bool();
+ break;
+
+ default:
+ ScriptSkipToNextParameter(sp,true);
+ break;
+ }
+ }
+
+ AddRes(rm, RES_TEXTURE, rc);
+}
+
+DWORD RTexture::Get(hgeResourceManager *rm)
+{
+ if(!handle) handle=(DWORD)hge->Texture_Load(filename, 0, mipmap);
+ return handle;
+}
+
+void RTexture::Free()
+{
+ if(handle) hge->Texture_Free((HTEXTURE)handle);
+ handle=0;
+}
+
+/////////////// REffect //
+
+void REffect::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
+{
+ ScriptParseFileResource(rm, sp, name, basename, new REffect(), RES_EFFECT);
+}
+
+DWORD REffect::Get(hgeResourceManager *rm)
+{
+ if(!handle) handle=(DWORD)hge->Effect_Load(filename);
+ return handle;
+}
+
+void REffect::Free()
+{
+ if(handle) hge->Effect_Free((HEFFECT)handle);
+ handle=0;
+}
+
+/////////////// RTarget //
+
+void RTarget::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
+{
+ RTarget *rc, *base;
+
+ rc = new RTarget();
+ base = (RTarget *)FindRes(rm, RES_TARGET, basename);
+ if(base) *rc=*base;
+ else
+ {
+ rc->resgroup=0;
+ rc->width=256;
+ rc->height=256;
+ rc->zbuffer=false;
+ }
+ rc->handle=0; strcpy(rc->name, name);
+
+ while(ScriptSkipToNextParameter(sp, false))
+ {
+ switch(sp->tokentype)
+ {
+ case TTPAR_SIZE:
+ sp->get_token(); sp->get_token();
+ rc->width=sp->tkn_int();
+ sp->get_token();
+ sp->get_token();
+ rc->height=sp->tkn_int();
+ break;
+
+ case TTPAR_ZBUFFER:
+ sp->get_token(); sp->get_token();
+ rc->zbuffer=sp->tkn_bool();
+ break;
+
+ case TTPAR_RESGROUP:
+ sp->get_token(); sp->get_token();
+ rc->resgroup=sp->tkn_int();
+ break;
+
+ default:
+ ScriptSkipToNextParameter(sp, true);
+ break;
+ }
+ }
+
+ AddRes(rm, RES_TARGET, rc);
+}
+
+DWORD RTarget::Get(hgeResourceManager *rm)
+{
+ if(!handle) handle=(DWORD)hge->Target_Create(width, height, zbuffer);
+ return handle;
+}
+
+void RTarget::Free()
+{
+ if(handle) hge->Target_Free((HTARGET)handle);
+ handle=0;
+}
+
+/////////////// RSprite //
+
+void RSprite::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
+{
+ RSprite *rc, *base;
+
+ rc = new RSprite();
+ base = (RSprite *)FindRes(rm, RES_SPRITE, basename);
+ if(base) *rc=*base;
+ else
+ {
+ rc->resgroup=0;
+ rc->texname[0]=0;
+ rc->tx=rc->ty=0;
+ rc->w=rc->h=0;
+ rc->hotx=rc->hoty=0;
+ rc->blend=BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE;
+ rc->color=0xFFFFFFFF;
+ rc->z=0.5f;
+ rc->bXFlip=false;
+ rc->bYFlip=false;
+// rc->x=rc->y=0;
+// rc->scale=1.0f;
+// rc->rotation=0.0f;
+// rc->collision=HGECOL_RECT;
+ }
+
+ rc->handle=0;
+ strcpy(rc->name, name);
+
+ ScriptParseSpriteAnim(sp, rc, false);
+ AddRes(rm, RES_SPRITE, rc);
+}
+
+DWORD RSprite::Get(hgeResourceManager *rm)
+{
+ hgeSprite *spr;
+ if(!handle)
+ {
+ spr = new hgeSprite(rm->GetTexture(texname, resgroup), tx, ty, w, h);
+ spr->SetColor(color);
+ spr->SetZ(z);
+ spr->SetBlendMode(blend);
+ spr->SetHotSpot(hotx,hoty);
+ spr->SetFlip(bXFlip, bYFlip);
+// spr->MoveTo(x,y);
+// spr->SetScale(scale);
+// spr->SetRotation(rotation);
+// spr->SetCollisionType(collision);
+
+ handle=(size_t)spr;
+ }
+ return handle;
+}
+
+void RSprite::Free()
+{
+ if(handle) delete (hgeSprite *)handle;
+ handle=0;
+}
+
+/////////////// RAnimation //
+
+void RAnimation::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
+{
+ RAnimation *rc, *base;
+
+ rc = new RAnimation();
+ base = (RAnimation *)FindRes(rm, RES_ANIMATION, basename);
+ if(base) *rc=*base;
+ else
+ {
+ rc->resgroup=0;
+ rc->texname[0]=0;
+ rc->tx=rc->ty=0;
+ rc->w=rc->h=0;
+ rc->hotx=rc->hoty=0;
+ rc->blend=BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE;
+ rc->color=0xFFFFFFFF;
+ rc->z=0.5f;
+ rc->bXFlip=false;
+ rc->bYFlip=false;
+// rc->x=rc->y=0;
+// rc->scale=1.0f;
+// rc->rotation=0.0f;
+// rc->collision=HGECOL_RECT;
+ rc->frames=1;
+ rc->fps=12.0f;
+ rc->mode=HGEANIM_FWD | HGEANIM_LOOP;
+ }
+
+ rc->handle=0;
+ strcpy(rc->name, name);
+
+ ScriptParseSpriteAnim(sp, rc, true);
+ AddRes(rm, RES_ANIMATION, rc);
+}
+
+DWORD RAnimation::Get(hgeResourceManager *rm)
+{
+ hgeAnimation *spr;
+ if(!handle)
+ {
+ spr = new hgeAnimation(rm->GetTexture(texname, resgroup), frames, fps, tx, ty, w, h);
+ spr->SetColor(color);
+ spr->SetZ(z);
+ spr->SetBlendMode(blend);
+ spr->SetHotSpot(hotx,hoty);
+ spr->SetFlip(bXFlip, bYFlip);
+// spr->MoveTo(x,y);
+// spr->SetScale(scale);
+// spr->SetRotation(rotation);
+// spr->SetCollisionType(collision);
+ spr->SetMode(mode);
+
+ handle=(size_t)spr;
+ }
+ return handle;
+}
+
+void RAnimation::Free()
+{
+ if(handle) delete (hgeAnimation *)handle;
+ handle=0;
+}
+
+/////////////// RFont //
+
+void RFont::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
+{
+ RFont *rc, *base;
+
+ rc = new RFont();
+ base = (RFont *)FindRes(rm, RES_FONT, basename);
+ if(base) *rc=*base;
+ else
+ {
+ rc->resgroup=0;
+ rc->mipmap=false;
+ rc->filename[0]=0;
+ rc->blend=BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE;
+ rc->color=0xFFFFFFFF;
+ rc->z=0.5f;
+ rc->scale=1.0f;
+ rc->proportion=1.0f;
+ rc->tracking=0.0f;
+ rc->spacing=1.0f;
+ rc->rotation=0.0f;
+ }
+ rc->handle=0; strcpy(rc->name, name);
+
+ while(ScriptSkipToNextParameter(sp,false))
+ {
+ switch(sp->tokentype)
+ {
+ case TTPAR_FILENAME:
+ sp->get_token(); sp->get_token();
+ strcpy(rc->filename, sp->tkn_string());
+ break;
+
+ case TTPAR_BLENDMODE:
+ ScriptParseBlendMode(sp, &rc->blend);
+ break;
+
+ case TTPAR_COLOR:
+ sp->get_token(); sp->get_token();
+ rc->color=sp->tkn_hex();
+ break;
+
+ case TTPAR_ZORDER:
+ sp->get_token(); sp->get_token();
+ rc->z=sp->tkn_float();
+ break;
+
+ case TTPAR_SCALE:
+ sp->get_token(); sp->get_token();
+ rc->scale=sp->tkn_float();
+ break;
+
+ case TTPAR_PROPORTION:
+ sp->get_token(); sp->get_token();
+ rc->proportion=sp->tkn_float();
+ break;
+
+ case TTPAR_ROTATION:
+ sp->get_token(); sp->get_token();
+ rc->rotation=sp->tkn_float();
+ break;
+
+ case TTPAR_TRACKING:
+ sp->get_token(); sp->get_token();
+ rc->tracking=sp->tkn_float();
+ break;
+
+ case TTPAR_SPACING:
+ sp->get_token(); sp->get_token();
+ rc->spacing=sp->tkn_float();
+ break;
+
+ case TTPAR_RESGROUP:
+ sp->get_token(); sp->get_token();
+ rc->resgroup=sp->tkn_int();
+ break;
+
+ case TTPAR_MIPMAP:
+ sp->get_token(); sp->get_token();
+ rc->mipmap=sp->tkn_bool();
+ break;
+
+ default:
+ ScriptSkipToNextParameter(sp, true);
+ break;
+ }
+ }
+
+ AddRes(rm, RES_FONT, rc);
+}
+
+DWORD RFont::Get(hgeResourceManager *rm)
+{
+ hgeFont *fnt;
+ if(!handle)
+ {
+ fnt = new hgeFont(filename, mipmap);
+ fnt->SetColor(color);
+ fnt->SetZ(z);
+ fnt->SetBlendMode(blend);
+ fnt->SetScale(scale);
+ fnt->SetProportion(proportion);
+ fnt->SetTracking(tracking);
+ fnt->SetSpacing(spacing);
+ fnt->SetRotation(rotation);
+
+ handle=(size_t)fnt;
+ }
+ return handle;
+}
+
+void RFont::Free()
+{
+ if(handle) delete (hgeFont *)handle;
+ handle=0;
+}
+
+/////////////// RParticle //
+
+void RParticle::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
+{
+ RParticle *rc, *base;
+
+ rc = new RParticle();
+ base = (RParticle *)FindRes(rm, RES_PARTICLE, basename);
+ if(base) *rc=*base;
+ else
+ {
+ rc->resgroup=0;
+ rc->filename[0]=0;
+ rc->spritename[0]=0;
+ }
+ rc->handle=0; strcpy(rc->name, name);
+
+ while(ScriptSkipToNextParameter(sp, false))
+ {
+ switch(sp->tokentype)
+ {
+ case TTPAR_FILENAME:
+ sp->get_token(); sp->get_token();
+ strcpy(rc->filename, sp->tkn_string());
+ break;
+
+ case TTPAR_SPRITE:
+ sp->get_token(); sp->get_token();
+ strcpy(rc->spritename, sp->tkn_string());
+ break;
+
+ case TTPAR_RESGROUP:
+ sp->get_token(); sp->get_token();
+ rc->resgroup=sp->tkn_int();
+ break;
+
+ default:
+ ScriptSkipToNextParameter(sp, true);
+ break;
+ }
+ }
+
+ AddRes(rm, RES_PARTICLE, rc);
+}
+
+DWORD RParticle::Get(hgeResourceManager *rm)
+{
+ hgeParticleSystem *par;
+ if(!handle)
+ {
+ par = new hgeParticleSystem(filename, rm->GetSprite(spritename));
+
+ handle=(size_t)par;
+ }
+ return handle;
+}
+
+void RParticle::Free()
+{
+ if(handle) delete (hgeParticleSystem *)handle;
+ handle=0;
+}
+
+/////////////// RDistort //
+
+void RDistort::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
+{
+ RDistort *rc, *base;
+
+ rc = new RDistort();
+ base = (RDistort *)FindRes(rm, RES_DISTORT, basename);
+ if(base) *rc=*base;
+ else
+ {
+ rc->resgroup=0;
+ rc->texname[0]=0;
+ rc->tx=rc->ty=0;
+ rc->w=rc->h=0;
+ rc->cols=rc->rows=2;
+ rc->blend=BLEND_COLORMUL | BLEND_ALPHABLEND | BLEND_NOZWRITE;
+ rc->color=0xFFFFFFFF;
+ rc->z=0.5f;
+ }
+ rc->handle=0; strcpy(rc->name, name);
+
+ while(ScriptSkipToNextParameter(sp, false))
+ {
+ switch(sp->tokentype)
+ {
+ case TTPAR_TEXTURE:
+ sp->get_token(); sp->get_token();
+ strcpy(rc->texname, sp->tkn_string());
+ break;
+
+ case TTPAR_RECT:
+ sp->get_token(); sp->get_token();
+ rc->tx=sp->tkn_float();
+ sp->get_token(); sp->get_token();
+ rc->ty=sp->tkn_float();
+ sp->get_token(); sp->get_token();
+ rc->w=sp->tkn_float();
+ sp->get_token(); sp->get_token();
+ rc->h=sp->tkn_float();
+ break;
+
+ case TTPAR_MESH:
+ sp->get_token(); sp->get_token();
+ rc->cols=sp->tkn_int();
+ sp->get_token(); sp->get_token();
+ rc->rows=sp->tkn_int();
+ break;
+
+ case TTPAR_BLENDMODE:
+ ScriptParseBlendMode(sp, &rc->blend);
+ break;
+
+ case TTPAR_COLOR:
+ sp->get_token(); sp->get_token();
+ rc->color=sp->tkn_hex();
+ break;
+
+ case TTPAR_ZORDER:
+ sp->get_token(); sp->get_token();
+ rc->z=sp->tkn_float();
+ break;
+
+ case TTPAR_RESGROUP:
+ sp->get_token(); sp->get_token();
+ rc->resgroup=sp->tkn_int();
+ break;
+
+ default:
+ ScriptSkipToNextParameter(sp, true);
+ break;
+ }
+ }
+
+ AddRes(rm, RES_DISTORT, rc);
+}
+
+DWORD RDistort::Get(hgeResourceManager *rm)
+{
+ hgeDistortionMesh *dis;
+ if(!handle)
+ {
+ dis = new hgeDistortionMesh(cols, rows);
+ dis->SetTexture(rm->GetTexture(texname, resgroup));
+ dis->SetTextureRect(tx,ty,w,h);
+ dis->SetBlendMode(blend);
+ dis->Clear(color,z);
+
+ handle=(size_t)dis;
+ }
+ return handle;
+}
+
+void RDistort::Free()
+{
+ if(handle) delete (hgeDistortionMesh *)handle;
+ handle=0;
+}
+
+/////////////// RStringTable //
+
+void RStringTable::Parse(hgeResourceManager *rm, RScriptParser *sp, const char *name, const char *basename)
+{
+ ScriptParseFileResource(rm, sp, name, basename, new RStringTable(), RES_STRTABLE);
+}
+
+DWORD RStringTable::Get(hgeResourceManager *rm)
+{
+ if(!handle) handle = (size_t)new hgeStringTable(filename);
+ return handle;
+}
+
+void RStringTable::Free()
+{
+ if(handle) delete (hgeStringTable *)handle;
+ handle=0;
+}