mahlendur/_work/Data/Scripts/Content/LeGo_NewVer/View.d
Daniel Heße 892a40ff0f Initial commit with Subversion-codebase from 13/05/2022.
Cleaned up the mess, at this time, only viable data get synced (_work directory for Gothic-data, miranda for mdc-scripts.
Need to symlink files to a working directory.
2022-05-13 17:38:52 +02:00

690 lines
21 KiB
D

/***********************************\
VIEW
\***********************************/
//========================================
// Klassen für PermMem
//========================================
instance zCView@ (zCView);
//========================================
// View erzeugen
//========================================
func void _ViewPtr_CreateIntoPtr(var int ptr, var int x1, var int y1, var int x2, var int y2) {
CALL_IntParam(2);
CALL_IntParam(y2);
CALL_IntParam(x2);
CALL_IntParam(y1);
CALL_IntParam(x1);
CALL__thiscall(ptr, zCView__zCView);
var zCView vw; vw = MEM_PtrToInst(ptr);
vw.fxOpen = 0; // Das sieht einfach nur hässlich aus.
vw.fxClose = 0;
};
func int ViewPtr_Create(var int x1, var int y1, var int x2, var int y2) {
var int ptr; ptr = create(zCView@);
_ViewPtr_CreateIntoPtr(ptr, x1, y1, x2, y2);
return ptr;
};
func int View_Create(var int x1, var int y1, var int x2, var int y2) {
var int hndl; hndl = new(zCView@);
var zCView v; v = get(hndl);
_ViewPtr_CreateIntoPtr(getPtr(hndl), x1, y1, x2, y2);
return hndl;
};
func int ViewPtr_New() {
return ViewPtr_Create(0, 0, 0, 0);
};
func int View_New() {
return View_Create(0, 0, 0, 0);
};
//========================================
// View erzeugen (Pixel)
//========================================
func int ViewPtr_CreatePxl(var int x1, var int y1, var int x2, var int y2) {
return ViewPtr_Create(Print_ToVirtual(x1, PS_X), Print_ToVirtual(y1, PS_Y),
Print_ToVirtual(x2, PS_X), Print_ToVirtual(y2, PS_Y));
};
func int View_CreatePxl(var int x1, var int y1, var int x2, var int y2) {
return View_Create(Print_ToVirtual(x1, PS_X), Print_ToVirtual(y1, PS_Y),
Print_ToVirtual(x2, PS_X), Print_ToVirtual(y2, PS_Y));
};
//========================================
// View erzeugen (Mittelpunkt)
//========================================
func int ViewPtr_CreateCenter(var int x, var int y, var int w, var int h) {
return ViewPtr_Create(x-(w>>1), y-(h>>1), x+((w+1)>>1), y+((h+1)>>1));
};
func int View_CreateCenter(var int x, var int y, var int w, var int h) {
return View_Create(x-(w>>1), y-(h>>1), x+((w+1)>>1), y+((h+1)>>1));
};
//========================================
// View erzeugen (Mittelpunkt)(Pixel)
//========================================
func int ViewPtr_CreateCenterPxl(var int x, var int y, var int w, var int h) {
return ViewPtr_CreateCenter(Print_ToVirtual(x, PS_X), Print_ToVirtual(y, PS_Y),
Print_ToVirtual(w, PS_X), Print_ToVirtual(h, PS_Y));
};
func int View_CreateCenterPxl(var int x, var int y, var int w, var int h) {
return View_CreateCenter(Print_ToVirtual(x, PS_X), Print_ToVirtual(y, PS_Y),
Print_ToVirtual(w, PS_X), Print_ToVirtual(h, PS_Y));
};
//========================================
// View holen
//========================================
func zCView View_Get(var int hndl) {
get(hndl);
};
//========================================
// View als Pointer holen
//========================================
func int View_GetPtr(var int hndl) {
getPtr(hndl);
};
//========================================
// View rendern (sollte nicht benutzt werden!)
//========================================
func void ViewPtr_Render(var int ptr) {
CALL__thiscall(ptr, zCView__Render);
};
func void View_Render(var int hndl) {
ViewPtr_Render(getPtr(hndl));
};
//========================================
// View eine Textur zuweisen
//========================================
func void ViewPtr_SetTexture(var int ptr, var string tex) {
tex = STR_Upper(tex);
CALL_zStringPtrParam(tex);
CALL__thiscall(ptr, zCView__InsertBack);
};
func void View_SetTexture(var int hndl, var string tex) {
ViewPtr_SetTexture(getPtr(hndl), tex);
};
func string ViewPtr_GetTexture(var int ptr) {
var zCView v; v = _^(ptr);
var zCObject obj; obj = MEM_PtrToInst(v.backtex);
return obj.objectName;
};
func string View_GetTexture(var int hndl) {
return ViewPtr_GetTexture(getPtr(hndl));
};
//========================================
// Mark:
// View set alpha
//========================================
func void ViewPtr_SetAlpha(var int ptr, var int val) {
var zCView v; v = _^(ptr);
v.alpha = val;
if((v.alpha != 255) && (v.alphafunc == 1)) {
v.alphafunc = 2;
};
};
func void View_SetAlpha(var int hndl,var int val) {
ViewPtr_SetAlpha(getPtr(hndl), val);
};
//========================================
// Mark: View set alpha
// (including all text within the view)
//========================================
func void ViewPtr_SetAlphaAll(var int ptr, var int val) {
var zCView v; v = _^(ptr);
v.alpha = val;
if((v.alpha != 255) && (v.alphafunc == 1)) {
v.alphafunc = 2;
};
if (v.textLines_next) {
var int list; list = v.textLines_next;
var zCList l;
while(list);
l = _^(list);
PrintPtr_SetAlpha(l.data,val);
list = l.next;
end;
};
};
func void View_SetAlphaAll(var int hndl, var int val) {
ViewPtr_SetAlphaAll(getPtr(hndl), val);
};
//========================================
// View einfärben
//========================================
func void ViewPtr_SetColor(var int ptr, var int zColor) {
var zCView v; v = _^(ptr);
v.color = zColor;
ViewPtr_SetAlpha(ptr, (zColor >> zCOLOR_SHIFT_ALPHA) & zCOLOR_CHANNEL);
};
func void View_SetColor(var int hndl, var int zColor) {
ViewPtr_SetColor(getPtr(hndl), zColor);
};
func int ViewPtr_GetColor(var int ptr) {
var zCView v; v = _^(ptr);
return v.color;
};
func int View_GetColor(var int hndl) {
return ViewPtr_GetColor(getPtr(hndl));
};
//========================================
// View anzeigen
//========================================
func void ViewPtr_Open(var int ptr) {
var zCView v; v = _^(ptr);
var int textlinesBak; textlinesBak = v.textLines_next;
v.textLines_next = 0;
// zCView::Open destroys all textlines (why??)
CALL__thiscall(ptr, zCView__Open);
v.textLines_next = textlinesBak;
};
func void View_Open(var int hndl) {
ViewPtr_Open(getPtr(hndl));
};
//========================================
// View schließen
//========================================
func void ViewPtr_Close(var int ptr) {
CALL__thiscall(ptr, zCView__Close);
};
func void View_Close(var int hndl) {
CALL__thiscall(getPtr(hndl), zCView__Close);
};
//========================================
// View löschen
//========================================
func void zCView_Delete(var zCView this) {
if (this.textlines_next) {
//free(this.textlines_next, zCList__zCViewText@);
this.textlines_next = 0;
};
CALL__thiscall(MEM_InstToPtr(this), zCView__@zCView);
};
func void ViewPtr_Delete(var int ptr) {
var zCView v; v = _^(ptr);
zCView_Delete(v);
MEM_Free(ptr);
};
func void View_Delete(var int hndl) {
var zCView v; v = get(hndl);
zCView_Delete(v);
release(hndl);
};
//========================================
// Größe ändern
//========================================
func void ViewPtr_Resize(var int ptr, var int x, var int y) {
var zCView v; v = _^(ptr);
if(y < 0) {
CALL_IntParam(v.vsizey);
}
else {
CALL_IntParam(y);
};
if(x < 0) {
CALL_IntParam(v.vsizex);
}
else {
CALL_IntParam(x);
};
CALL__thiscall(ptr, zCView__SetSize);
v.psizex = Print_ToPixel(v.vsizex, PS_X);
v.psizey = Print_ToPixel(v.vsizey, PS_Y);
};
func void View_Resize(var int hndl, var int x, var int y) {
ViewPtr_Resize(getPtr(hndl), x, y);
};
//========================================
// Größe ändern (pxl)
//========================================
func void ViewPtr_ResizePxl(var int ptr, var int x, var int y) {
ViewPtr_Resize(ptr, Print_ToVirtual(x, PS_X), Print_ToVirtual(y, PS_Y));
};
func void View_ResizePxl(var int hndl, var int x, var int y) {
ViewPtr_ResizePxl(getPtr(hndl), x, y);
};
//========================================
// Bewegen
//========================================
func void ViewPtr_Move(var int ptr, var int x, var int y) {
var zCView v; v = _^(ptr);
CALL_IntParam(y);
CALL_IntParam(x);
CALL__thiscall(ptr, zCView__Move);
v.pposx = Print_ToPixel(v.vposx, PS_X);
v.pposy = Print_ToPixel(v.vposy, PS_Y);
};
func void View_Move(var int hndl, var int x, var int y) {
ViewPtr_Move(getPtr(hndl), x, y);
};
//========================================
// Bewegen (pxl)
//========================================
func void ViewPtr_MovePxl(var int ptr, var int x, var int y) {
ViewPtr_Move(ptr, Print_ToVirtual(x, PS_X), Print_ToVirtual(y, PS_Y));
};
func void View_MovePxl(var int hndl, var int x, var int y) {
ViewPtr_MovePxl(getPtr(hndl), x, y);
};
//========================================
// Bewegen (absolut)
//========================================
func void ViewPtr_MoveTo(var int ptr, var int x, var int y) {
var zCView v; v = _^(ptr);
if(x == -1) { x = v.vposx; };
if(y == -1) { y = v.vposy; };
ViewPtr_Move(ptr, -v.vposx, -v.vposy);
ViewPtr_Move(ptr, x, y);
};
func void View_MoveTo(var int hndl, var int x, var int y) {
ViewPtr_MoveTo(getPtr(hndl), x, y);
};
//========================================
// Bewegen (absolut)(pxl)
//========================================
func void ViewPtr_MoveToPxl(var int ptr, var int x, var int y) {
if(x != -1) { x = Print_ToVirtual(x, PS_X); };
if(y != -1) { y = Print_ToVirtual(y, PS_Y); };
ViewPtr_MoveTo(ptr, x, y);
};
func void View_MoveToPxl(var int hndl, var int x, var int y) {
ViewPtr_MoveToPxl(getPtr(hndl), x, y);
};
//========================================
// Text entfernen
//========================================
func void View_DeleteTextSub(var int listPtr) {
var zCList l; l = MEM_PtrToInst(listPtr);
MEM_Free(l.data);
};
func void ViewPtr_DeleteText(var int ptr) {
var zCView v; v = _^(ptr);
if (v.textLines_next) {
List_ForF(v.textLines_next, View_DeleteTextSub);
List_Destroy(v.textLines_next);
v.textLines_next = 0;
};
};
func void View_DeleteText(var int hndl) {
ViewPtr_DeleteText(getPtr(hndl));
};
//========================================
// Text hinzufügen
//========================================
func void ViewPtr_AddText(var int ptr, var int x, var int y, var string text, var string font, var int color) {
var zCView v; v = _^(ptr);
var int field; field = Print_TextFieldColored(x, y, text, font, Print_ToVirtual(Print_GetFontHeight(font), v.psizey), color);
if(v.textLines_next) {
List_Concat(v.textLines_next, field);
}
else {
v.textLines_next = field;
};
};
func void View_AddText(var int hndl, var int x, var int y, var string text, var string font) {
ViewPtr_AddText(getPtr(hndl), x, y, text, font, -1);
};
func void View_AddTextColored(var int hndl, var int x, var int y, var string text, var string font, var int color) {
ViewPtr_AddText(getPtr(hndl), x, y, text, font, color);
};
//========================================
// Textview hinzufügen
//========================================
func void ViewPtr_AddTextView(var int ptr, var int view) {
var zCView v; v = _^(ptr);
if(v.textLines_next) {
List_Concat(v.textLines_next, view);
}
else {
v.textLines_next = List_Create(view);
};
};
func void View_AddTextView(var int hndl, var int view) {
ViewPtr_AddTextView(getPtr(hndl), view);
};
//========================================
// Views ausrichten
//========================================
func void ViewPtr_SetMargin(var int ptr, var int parent, var int align, var int mT, var int mR, var int mB, var int mL) {
var zCView v;
if(!parent) {
// using screen if no parent is given
v = _^(MEM_ReadInt(screen));
}
else {
v = _^(parent);
};
if(align == ALIGN_LEFT) {
ViewPtr_MoveTo(ptr, v.vposx + mL, v.vposy + mT);
ViewPtr_Resize(ptr, mR, v.vsizey - mT - mB);
}
else if(align == ALIGN_RIGHT) {
ViewPtr_MoveTo(ptr, v.vposx + v.vsizex - mR - mL, v.vposy + mT);
ViewPtr_Resize(ptr, mL, v.vsizey - mT - mB);
}
else if(align == ALIGN_TOP) {
ViewPtr_MoveTo(ptr, v.vposx + mL, v.vposy + mT);
ViewPtr_Resize(ptr, v.vsizex - mL - mR, mB);
}
else if(align == ALIGN_BOTTOM) {
ViewPtr_MoveTo(ptr, v.vposx + mL, v.vposy + v.vsizey - mT - mB);
ViewPtr_Resize(ptr, v.vsizex - mL - mR, mT);
}
else {
ViewPtr_MoveTo(ptr, v.vposx + mL, v.vposy + mT);
ViewPtr_Resize(ptr, v.vsizex - mL - mR, v.vsizey - mT - mB);
};
};
func void ViewPtr_SetMarginPxl(var int ptr, var int parent, var int align, var int mT, var int mR, var int mB, var int mL) {
ViewPtr_SetMargin(ptr, parent, align, Print_ToVirtual(mT, PS_Y), Print_ToVirtual(mR, PS_X), Print_ToVirtual(mB, PS_Y), Print_ToVirtual(mL, PS_X));
};
//========================================
// Eine Viewliste an einen parent kleben
//========================================
func void ViewList_GlueToAxis(var int list, var int parent, var int axis, var int mT, var int mR, var int mB, var int mL) {
var zCView v;
if(!parent) {
// using screen if no parent is given
v = _^(MEM_ReadInt(screen));
}
else {
v = _^(parent);
};
var int i; i = 0;
var int itemSize;
var int items; items = List_Length(list);
var zCList l;
if(axis == PS_X) {
l = _^(list);
itemSize = v.vsizex / items;
repeat(i, items);
ViewPtr_SetMargin(l.data, parent, ALIGN_LEFT, mT, itemSize - mL - mR, mB, i * itemSize + mL);
if(l.next) {
l = _^(l.next);
};
end;
}
else {
l = _^(list);
itemSize = v.vsizey / items;
repeat(i, items);
ViewPtr_SetMargin(l.data, parent, ALIGN_TOP, i * itemSize + mT, mL, itemSize - mT - mB, mR);
if(l.next) {
l = _^(l.next);
};
end;
};
};
func void ViewList_GlueToAxisPxl(var int list, var int parent, var int axis, var int mT, var int mR, var int mB, var int mL) {
ViewList_GlueToAxis(list, parent, axis, Print_ToVirtual(mT, PS_Y), Print_ToVirtual(mR, PS_X), Print_ToVirtual(mB, PS_Y), Print_ToVirtual(mL, PS_X));
};
//========================================
// Text ausrichten
//========================================
func void ViewPtr_AlignText(var int ptr, var int margin) {
var zCView v; v = _^(ptr);
var int lp; lp = v.textLines_next;
var zCList l;
var zCViewText vt;
var int width;
if(margin == 0) {
while(lp);
l = _^(lp);
vt = _^(l.data);
width = Print_ToVirtual(Print_GetStringWidthPtr(vt.text, vt.font), PS_X) * PS_VMAX / v.vsizex;
vt.posx = PS_VMAX / 2 - width / 2;
lp = l.next;
end;
}
else if(margin > 0) {
while(lp);
l = _^(lp);
vt = _^(l.data);
vt.posx = margin;
lp = l.next;
end;
}
else {
while(lp);
l = _^(lp);
vt = _^(l.data);
width = Print_ToVirtual(Print_GetStringWidthPtr(vt.text, vt.font), PS_X) * PS_VMAX / v.vsizex;
vt.posx = PS_VMAX - width - margin;
lp = l.next;
end;
};
};
//========================================
// View nach oben bewegen
//========================================
func void ViewPtr_Top(var int ptr) {
Call__thiscall(ptr, zCView_Top);
};
func void View_Top(var int hndl) {
ViewPtr_Top(getPtr(hndl));
};
func void zCView_Archiver(var zCView this) {
PM_SaveInt("_vtbl", this._vtbl);
PM_SaveInt("_zCInputCallBack_vtbl", this._zCInputCallBack_vtbl);
if (MEMINT_SwitchG1G2(false, true)) {
/* Gothic 1 kennt die Eigenschaft m_bFillZ nicht, daher die Pointerarithmetik hier */
PM_SaveInt("m_bFillZ", MEM_ReadInt(_@(this)+8));
};
PM_SaveInt("next", this.next);
PM_SaveInt("ViewID", this.viewID);
PM_SaveInt("flags", this.flags);
PM_SaveInt("intflags", this.intflags);
PM_SaveInt("onDesk", this.onDesk);
PM_SaveInt("alphaFunc", this.alphaFunc);
PM_SaveInt("color", this.color);
PM_SaveInt("alpha", this.alpha);
PM_SaveInt("childs_compare", this.childs_compare);
PM_SaveInt("childs_count", this.childs_count);
PM_SaveInt("childs_last", this.childs_last);
PM_SaveInt("childs_wurzel", this.childs_wurzel);
PM_SaveInt("owner", this.owner);
PM_SaveString("backtex", zCTexture_GetName(this.backtex));
PM_SaveInt("vposx", this.vposx);
PM_SaveInt("vposy", this.vposy);
PM_SaveInt("vsizex", this.vsizex);
PM_SaveInt("vsizey", this.vsizey);
PM_SaveInt("pposx", this.pposx);
PM_SaveInt("pposy", this.pposy);
PM_SaveInt("psizex", this.psizex);
PM_SaveInt("psizey", this.psizey);
PM_SaveString("font", Print_GetFontName(this.font));
PM_SaveInt("fontColor", this.fontColor);
PM_SaveInt("px1", this.px1);
PM_SaveInt("py1", this.py1);
PM_SaveInt("px2", this.px2);
PM_SaveInt("py2", this.py2);
PM_SaveInt("winx", this.winx);
PM_SaveInt("winy", this.winy);
PM_SaveClassPtr("textLines", this.textLines_next, "zCList__zCViewText");
PM_SaveInt("scrollMaxTime", this.scrollMaxTime);
PM_SaveInt("scrollTimer", this.scrollTimer);
PM_SaveInt("fxOpen", this.fxOpen);
PM_SaveInt("fxClose", this.fxClose);
PM_SaveInt("timeDialog", this.timeDialog);
PM_SaveInt("timeOpen", this.timeOpen);
PM_SaveInt("timeClose", this.timeClose);
PM_SaveInt("speedOpen", this.speedOpen);
PM_SaveInt("speedClose", this.speedClose);
PM_SaveInt("isOpen", this.isOpen);
PM_SaveInt("isClosed", this.isClosed);
PM_SaveInt("continueOpen", this.continueOpen);
PM_SaveInt("continueClose", this.continueClose);
PM_SaveInt("removeOnClose", this.removeOnClose);
PM_SaveInt("resizeOnOpen", this.resizeOnOpen);
PM_SaveInt("maxTextLength", this.maxTextLength);
PM_SaveString("textMaxLength", this.textMaxLength);
PM_SaveIntArray("posCurrent_0", _@(this.posCurrent_0), 2);
PM_SaveIntArray("posCurrent_1", _@(this.posCurrent_1), 2);
PM_SaveIntArray("posOpenClose_0", _@(this.posOpenClose_0), 2);
PM_SaveIntArray("posOpenClose_1", _@(this.posOpenClose_1), 2);
};
func void zCView_Unarchiver(var zCView this) {
var int vx1; vx1 = PM_Load("vposx");
var int vy1; vy1 = PM_Load("vposy");
var int vx2; vx2 = vx1 + PM_Load("vsizex");
var int vy2; vy2 = vy1 + PM_Load("vsizey");
_ViewPtr_CreateIntoPtr(_@(this), vx1, vy1, vx2, vy2);
this._vtbl = PM_LoadInt("_vtbl");
this._zCInputCallBack_vtbl = PM_LoadInt("_zCInputCallBack_vtbl");
if (MEMINT_SwitchG1G2(false, true)) {
/* Gothic 1 kennt die Eigenschaft m_bFillZ nicht, daher die Pointerarithmetik hier */
MEM_WriteInt(_@(this)+8, PM_LoadInt("m_bFillZ"));
};
// this.next = PM_LoadInt("next"); // Darf ich nicht überschreiben, habs der Übersicht halber aber hier gelassen
this.viewID = PM_LoadInt("ViewID");
this.flags = PM_LoadInt("flags");
this.intflags = PM_LoadInt("intflags");
// this.onDesk darf nicht geladen werden.
this.alphaFunc = PM_LoadInt("alphaFunc");
this.color = PM_LoadInt("color");
this.alpha = PM_LoadInt("alpha");
/*this.childs_compare = PM_LoadInt("childs_compare"); // Darf ich eventuell überschreiben, ist aber eh Schwachsinn da Pointer
this.childs_count = PM_LoadInt("childs_count");
this.childs_last = PM_LoadInt("childs_last");
this.childs_wurzel = PM_LoadInt("childs_wurzel"); */
// this.owner = PM_LoadInt("owner"); // Darf ich nicht überschreiben, habs der Übersicht halber aber hier gelassen
ViewPtr_SetTexture(_@(this), PM_LoadString("backtex"));
this.vposx = PM_LoadInt("vposx");
this.vposy = PM_LoadInt("vposy");
this.vsizex = PM_LoadInt("vsizex");
this.vsizey = PM_LoadInt("vsizey");
this.pposx = PM_LoadInt("pposx");
this.pposy = PM_LoadInt("pposy");
this.psizex = PM_LoadInt("psizex");
this.psizey = PM_LoadInt("psizey");
this.font = Print_GetFontPtr(PM_LoadString("font"));
this.fontColor = PM_LoadInt("fontColor");
this.px1 = PM_LoadInt("px1");
this.py1 = PM_LoadInt("py1");
this.px2 = PM_LoadInt("px2");
this.py2 = PM_LoadInt("py2");
this.winx = PM_LoadInt("winx");
this.winy = PM_LoadInt("winy");
this.scrollMaxTime = PM_LoadInt("scrollMaxTime");
this.scrollTimer = PM_LoadInt("scrollTimer");
this.fxOpen = PM_LoadInt("fxOpen");
this.fxClose = PM_LoadInt("fxClose");
this.timeDialog = PM_LoadInt("timeDialog");
this.timeOpen = PM_LoadInt("timeOpen");
this.timeClose = PM_LoadInt("timeClose");
this.speedOpen = PM_LoadInt("speedOpen");
this.speedClose = PM_LoadInt("speedClose");
this.isOpen = PM_LoadInt("isOpen");
this.isClosed = PM_LoadInt("isClosed");
this.continueOpen = PM_LoadInt("continueOpen");
this.continueClose = PM_LoadInt("continueClose");
this.removeOnClose = PM_LoadInt("removeOnClose");
this.resizeOnOpen = PM_LoadInt("resizeOnOpen");
this.maxTextLength = PM_LoadInt("maxTextLength");
this.textMaxLength = PM_LoadString("textMaxLength");
PM_LoadArrayToPtr("posCurrent_0", _@(this.posCurrent_0));
PM_LoadArrayToPtr("posCurrent_1", _@(this.posCurrent_1));
PM_LoadArrayToPtr("posOpenClose_0", _@(this.posOpenClose_0));
PM_LoadArrayToPtr("posOpenClose_1", _@(this.posOpenClose_1));
if (PM_Load("ondesk")) {
ViewPtr_Open(_@(this));
};
this.textLines_next = PM_LoadClassPtr("textLines"); // Muss ich nach dem öffnen machen... >.>
};