mahlendur/_work/Data/Scripts/Content/LeGo_NewVer/Interface.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

446 lines
13 KiB
D
Raw Blame History

/***********************************\
INTERFACE
\***********************************/
var int Print_List; //zCList_zCViewText@
//========================================
// Vergangene Zeit seit Systemstart
//========================================
// Danke an Sektenspinner
func int sysGetTime() {
CALL__cdecl(sysGetTimePtr);
return CALL_RetValAsInt();
};
//========================================
// Farbhandling
//========================================
func int RGBA(var int r, var int g, var int b, var int a) {
if(!a){if(!b){if(!g){if(!r){return 1;};};};};
return ((r&zCOLOR_CHANNEL)<<zCOLOR_SHIFT_RED)
|((g&zCOLOR_CHANNEL)<<zCOLOR_SHIFT_GREEN)
|((b&zCOLOR_CHANNEL)<<zCOLOR_SHIFT_BLUE)
|((a&zCOLOR_CHANNEL)<<zCOLOR_SHIFT_ALPHA);
};
func int ChangeAlpha(var int zCol, var int a) {
return ((zCol & ~(zCOLOR_CHANNEL<<zCOLOR_SHIFT_ALPHA)) | ((a&zCOLOR_CHANNEL)<<zCOLOR_SHIFT_ALPHA));
};
func int GetAlpha(var int zCol) {
return (zCol&(zCOLOR_CHANNEL<<zCOLOR_SHIFT_ALPHA))>>zCOLOR_SHIFT_ALPHA;
};
//========================================
// Text generieren
//========================================
func int Print_CreateText(var string text, var string font) {
var int hndl; hndl = new(zCViewText@);
var zCViewText txt; txt = get(hndl);
txt.timed = 0;
txt.font = Print_GetFontPtr(font);
txt.color = -1;
txt.text = text;
return hndl;
};
func int Print_CreateTextPtr(var string text, var string font) {
var int ptr; ptr = create(zCViewText@);
var zCViewText txt; txt = _^(ptr);
txt.timed = 0;
txt.font = Print_GetFontPtr(font);
txt.text = text;
txt.color = -1;
return ptr;
};
func int Print_CreateTextPtrColored(var string text, var string font, var int color) {
var int ptr; ptr = create(zCViewText@);
var zCViewText txt; txt = _^(ptr);
txt.timed = 0;
txt.font = Print_GetFontPtr(font);
txt.text = text;
txt.color = color;
if (!color == -1) {
txt.colored = 1;
};
return ptr;
};
//========================================
// Text als zCViewText erhalten
//========================================
func zCViewText Print_GetText(var int hndl) {
get(hndl);
};
func int Print_GetTextPtr(var int hndl) {
return getPtr(hndl);
};
//========================================
// Text l<>schen
//========================================
func void Print_DeleteText(var int hndl) {
if (!Hlp_IsValidHandle(hndl)) { return; };
var zCViewText txt; txt = Print_GetText(hndl);
zCViewText_Delete(txt);
delete(hndl);
};
//========================================
// Mark: Print set alpha
//========================================
// pointer
func void PrintPtr_SetAlpha(var int ptr, var int a) {
if (!ptr) { return; };
var zCViewText txt; txt = MEM_PtrToInst(ptr);
txt.colored = 1;
txt.color = ChangeAlpha(txt.color, a);
};
// handle
func void Print_SetAlpha(var int hndl, var int a) {
if (!Hlp_IsValidHandle(hndl)) { return; };
PrintPtr_SetAlpha(getPtr(hndl), a);
};
//========================================
// Screengr<67><72>e (in Pixeln)
//========================================
var int Print_Ratio; //float
func void _Print_Ratio() {
Print_Ratio = mkf(Print_Screen[PS_X]);
Print_Ratio = divf(Print_Ratio, mkf(Print_Screen[PS_Y]));
};
var int Print_Screen[2];
func void Print_GetScreenSize() {
if (!_@(MEM_Game)) {
// Initialize if called during level change
MEM_InitGlobalInst();
};
var zCView screen; screen = _^(MEM_Game._zCSession_viewport);
Print_Screen[PS_X] = screen.psizex;
Print_Screen[PS_Y] = screen.psizey;
_Print_Ratio();
};
//========================================
// Pixel in Virtuelle Koordinaten
//========================================
func int Print_ToVirtualF(var int pxl, var int dim) {
Print_GetScreenSize();
pxl *= PS_VMax;
if(dim == PS_X) {
return fracf(pxl, Print_Screen[PS_X]);
}
else if(dim == PS_Y) {
return fracf(pxl, Print_Screen[PS_Y]);
};
return fracf(pxl, dim);
};
func int Print_ToPixelF(var int vrt, var int dim) {
Print_GetScreenSize();
if(dim == PS_X) {
vrt *= Print_Screen[PS_X];
}
else if(dim == PS_Y) {
vrt *= Print_Screen[PS_Y];
}
else {
vrt *= dim;
};
return fracf(vrt, PS_VMax);
};
func int Print_ToVirtual(var int pxl, var int dim) {
return roundf(Print_ToVirtualF(pxl, dim));
};
func int Print_ToPixel(var int vrt, var int dim) {
return roundf(Print_ToPixelF(vrt, dim));
};
func int Print_ToRatio(var int size, var int dim) {
if (dim == PS_Y) {
return roundf(mulf(mkf(size), Print_Ratio));
} else if (dim == PS_X) {
return roundf(divf(mkf(size), Print_Ratio));
};
return -1;
};
func int Print_ToRadian(var int angle) {
const int toRadian = 1016003125; // 0.017453292
mulf(angle, toRadian);
};
func int Print_ToDegree(var int angle) {
const int toDegree = 1113927393; // 57.29578
mulf(angle, toDegree);
};
//========================================
// Erweitertes PrintScreen
//========================================
instance zCViewTextPrint(zCViewText) {
_vtbl = zCViewText_vtbl;
inPrintWin = 0;
timer = 0;
timed = 0;
colored = 0;
color = 0;
};
func void zCViewTextPrint_UnArchiver(var zCViewText this) {
this._vtbl = PM_LoadInt("vtbl");
this.posx = PM_LoadInt("posx");
this.posy = PM_LoadInt("posy");
this.text = PM_LoadString("text");
this.font = Print_GetFontPtr(PM_LoadString("fontname"));
this.timer = PM_LoadInt("timer");
this.inPrintWin = PM_LoadInt("inPrintWin");
this.color = PM_LoadInt("color");
this.timed = PM_LoadInt("timed");
this.colored = PM_LoadInt("colored");
var zCView v; v = _^(MEM_Game.array_view[0]);
if (v.textlines_next) {
List_Add(v.textlines_next, MEM_InstToPtr(this));
} else {
v.textlines_next = List_Create(MEM_InstToPtr(this));
};
};
func int Print_Ext(var int x, var int y, var string text, var string font, var int color, var int time) {
if (!_@(MEM_Game)) || (!_@(MEM_StackPos)) {
// Initialize if called during level change
MEM_InitLabels();
MEM_InitGlobalInst();
};
if (time == -1) {
var int h; h = new(zCViewTextPrint);
var zCViewText txt; txt = get(h);
} else {
h = -1;
txt = _^(create(zCViewTextPrint));
};
if(!color) { color = 1; };
txt.timed = (time != -1);
if (time != -1) { txt.timer = mkf(time); };
txt.font = Print_GetFontPtr(font);
txt.color = color;
txt.text = text;
txt.colored = 1;
txt.posx = x;
if (x == -1) {
txt.posx = (PS_VMax - Print_ToVirtual(Print_GetStringWidth(text, font), PS_X)) / 2;
};
txt.posy = y;
if (y == -1) {
txt.posy = (PS_VMax - Print_ToVirtual(Print_GetFontHeight(font), PS_Y)) / 2;
};
var zCView v; v = _^(MEM_Game.array_view[0]);
if (v.textlines_next) {
List_Add(v.textlines_next, MEM_InstToPtr(txt));
} else {
v.textlines_next = List_Create(MEM_InstToPtr(txt));
};
return h;
};
//========================================
// Erweitertes PrintScreen (pixel)
//========================================
func int Print_ExtPxl(var int x, var int y, var string text, var string font, var int color, var int time) {
Print_Ext(Print_ToVirtual(x, PS_X), Print_ToVirtual(y, PS_Y), text, font, color, time);
};
//========================================
// Textfeld
//========================================
func string Print_LongestLineExt(var string text, var string font, var string separator) {
var int cnt; cnt = STR_SplitCount(text, separator);
var int i; i = 0;
var int max; max = 0;
var int tmp; tmp = 0;
var int pos; pos = MEM_StackPos.position;
if (i >= cnt) {
return STR_Split(text, separator, i-1);
};
tmp = Print_GetStringWidth(STR_Split(text, separator, i), font);
if (tmp > max) {
max = tmp;
};
i+=1;
MEM_StackPos.position = pos;
};
func string Print_LongestLine(var string text, var string font) {
Print_LongestLineExt(text, font, Print_LineSeperator);
};
func int Print_LongestLineLengthExt(var string text, var string font, var string separator) {
return Print_GetStringWidth(Print_LongestLineExt(text, font, separator), font);
};
func int Print_LongestLineLength(var string text, var string font) {
return Print_LongestLineLengthExt(text, font, Print_LineSeperator);
};
func int Print_TextFieldColored(var int x, var int y, var string text, var string font, var int height, var int color) {
var int cnt; cnt = STR_SplitCount(text, Print_LineSeperator);
var int i; i = 1;
var int ptr; ptr = Print_CreateTextPtrColored(STR_Split(text, Print_LineSeperator, 0), font, color);
var zCViewText txt; txt = _^(ptr);
txt.posx = x;
txt.posy = y;
var int list; list = List_Create(Ptr);
var int pos; pos = MEM_StackPos.position;
if (i >= cnt) {
return list;
};
ptr = Print_CreateTextPtrColored(STR_Split(text, Print_LineSeperator, i), font, color);
txt = _^(ptr);
txt.posx = x;
txt.posy = y+(height*i);
List_Add(list, ptr);
i+=1;
MEM_StackPos.position = pos;
};
func int Print_TextField(var int x, var int y, var string text, var string font, var int height) {
return Print_TextFieldColored(x, y, text, font, height, -1);
};
func int Print_TextFieldPxl(var int x, var int y, var string text, var string font) {
return Print_TextField(Print_ToVirtual(x, PS_X), Print_ToVirtual(y, PS_Y), text, font, Print_ToVirtual(Print_GetFontHeight(font), PS_Y));
};
//========================================
// Klasse f<>r PermMem
//========================================
class gCPrintS {
var int a8_Alpha; // Anim8(h)
var int a8_Movement; // Anim8(h)
var int tv_Text; // Print(h)
var int vr_Pos;
var int vr_Offs;
};
instance gCPrintS@(gCPrintS);
var int gCPrintS_Act;
var int gCPrintS_COff;
func void gCPrintS_Delete(var gCPrintS this) {
Anim8_Delete(this.a8_Movement);
Print_DeleteText(this.tv_Text);
};
func void gCPrintS_Alpha(var int h, var int value) {
var gCPrintS p; p = get(h);
var zCViewText t; t = get(p.tv_Text);
t.color = ChangeAlpha(t.color, value);
if(gCPrintS_COff > p.vr_Offs) {
p.vr_Pos -= (gCPrintS_COff - p.vr_Offs) * PF_TextHeight;
Anim8(p.a8_Movement, p.vr_Pos, PF_MoveYTime, A8_SlowEnd);
p.vr_Offs = gCPrintS_COff;
};
};
func void gCPrintS_Position(var int h, var int value) {
var gCPrintS p; p = get(h);
var zCViewText t; t = get(p.tv_Text);
t.posY = value;
};
//========================================
// Softprint
//========================================
func void PrintS_Ext(var string txt, var int color) {
var int h; h = new(gCPrintS@);
var gCPrintS p; p = get(h);
var int v;
v = Anim8_NewExt(1, gCPrintS_Alpha, h, false);
Anim8_RemoveIfEmpty(v, true);
Anim8_RemoveDataIfEmpty(v, true);
Anim8 (v, 255, PF_FadeInTime, A8_Constant);
Anim8q(v, 0, PF_WaitTime, A8_Wait);
Anim8q(v, 0, PF_FadeOutTime, A8_SlowStart);
p.a8_Alpha = v;
v = Anim8_NewExt(PF_PrintY, gCPrintS_Position, h, false);
Anim8 (v, PF_PrintY - PF_TextHeight, PF_MoveYTime, A8_SlowEnd);
p.a8_Movement = v;
p.tv_Text = Print_Ext(PF_PrintX, PF_PrintY, txt, PF_Font, color, -1);
p.vr_Pos = PF_PrintY - PF_TextHeight;
gCPrintS_COff += 1;
if(!gCPrintS_Act) {
gCPrintS_COff = 0;
};
gCPrintS_Act += 1;
p.vr_Offs = gCPrintS_COff;
};
func void AI_PrintS_Ext(var c_npc slf, var string txt, var int color) {
AI_Function_SI(slf, PrintS_Ext, txt, color);
};
//========================================
// vereinfachter Softprint
//========================================
func void PrintS(var string txt) {
PrintS_Ext(txt, RGBA(255,255,255,0));
};
func void AI_PrintS(var c_npc slf, var string txt) {
AI_Function_S(slf, PrintS, txt);
};
//========================================
// PrintScreen fixen
//========================================
func void Print_FixPS() {
/* All zCView::PrintTimed* functions that are called by the externals PrintScreen and AI_PrintScreen
* call zCView::CreateText with the arguments "color" and "colored" set to zero/False. These are
* overwritten here to force white text, regardless of previous prints.
*/
const int addr_color[4] = { zCView__PrintTimed_color, zCView__PrintTimedCX_color,
zCView__PrintTimedCY_color, zCView__PrintTimedCXY_color };
const int addr_colored[4] = { zCView__PrintTimed_colored, zCView__PrintTimedCX_colored,
zCView__PrintTimedCY_colored, zCView__PrintTimedCXY_colored };
const int offset[4] = { 28, 64, 32, 60 }; // Function stack offsets for value of "color"
repeat(i, 4); var int i;
// Set argument "color" to white
var int addr; addr = MEM_ReadStatArr(addr_color, i);
MemoryProtectionOverride(addr, 8);
MEM_WriteInt(addr, 2376903); // mov DWORD [esp+offset], -1
MEM_WriteByte(addr+3, MEM_ReadStatArr(offset, i));
MEM_WriteInt(addr+4, -1);
// Set argument "colored" to true
addr = MEM_ReadStatArr(addr_colored, i);
MemoryProtectionOverride(addr, 4);
MEM_WriteInt(addr, 23761040); // nop; nop; push 1
end;
};