I'm releasing it as an example/snippet.
ofc it can be improved in a number of ways.
/*
KHUD
client.add_hud() | Allows you to create a ID associated with a /khud object.
client.add_container() | Allows you to create a container for /khud objects IDs.
client.hide_hud() | Hides the selected object/container from your screen.
client.show_hud() | Allows you to see the selected object/container.
client.move_hud() | Allows you to move a container and the items within the container.
TEXT
client.add_text() | Allows you to add maptext to the select khud with positioning parameters.
client.change_text() | Allows you to modify the selected khud's maptext after you've added it.
client.clean_text() | Removes the maptext from the selected khud.
client.clean_container_text() | Removes the maptext from the selected khuds.
MISC
client.layer () | Allows you to modify the selected khud's layer.
client.relocate() | Allows you to modify the screen_loc for the selected khud.
*/
// This is the engine, gl o7
proc
screen_loc_math(loc,dir,size)
var/list/A = splittext(loc,","),list/B = splittext(A[1],":"),list/C = splittext(A[2],":")
var/list/L = list(text2num(B[1]),B.len > 1 ? text2num(B[2]) : 0,text2num(C[1]),C.len > 1 ? text2num(C[2]) : 0)
switch(dir)
if(NORTH)
return "[L[1]]:[L[2]],[L[3]]:[L[4]+size]"
if(NORTHEAST)
return "[L[1]]:[L[2]+size],[L[3]]:[L[4]+size]"
if(NORTHWEST)
return "[L[1]]:[L[2]-size],[L[3]]:[L[4]+size]"
if(SOUTH)
return "[L[1]]:[L[2]],[L[3]]:[L[4]-size]"
if(SOUTHEAST)
return "[L[1]]:[L[2]+size],[L[3]]:[L[4]-size]"
if(SOUTHWEST)
return "[L[1]]:[L[2]-size],[L[3]]:[L[4]-size]"
if(EAST)
return "[L[1]]:[L[2]+size],[L[3]]:[L[4]]"
if(WEST)
return "[L[1]]:[L[2]-size],[L[3]]:[L[4]]"
return "[L[1]]:[L[2]],[L[3]]:[L[4]]"
client
var
list
containers[] = new
list
hud[] = new
moving_element = FALSE
khud/slot/interact = null
proc
layer(ID,INT)
var/khud/KHUD = src.hud[ID]
if(KHUD)
KHUD.layer = INT ? INT : KHUD.layer
change_text(ID,string,color="#FFFFFF")
var/khud/KHUD = src.hud[ID]
if(KHUD)
KHUD.overlays = list()
KHUD.overlays += build_maptext(string,"#666666",KHUD.layer + 1,KHUD.maptext_x-1,KHUD.maptext_y)
KHUD.overlays += build_maptext(string,"#666666",KHUD.layer + 1,KHUD.maptext_x+1,KHUD.maptext_y)
KHUD.overlays += build_maptext(string,"#666666",KHUD.layer + 1,KHUD.maptext_x,KHUD.maptext_y+1)
KHUD.overlays += build_maptext(string,"#666666",KHUD.layer + 1,KHUD.maptext_x,KHUD.maptext_y-1)
KHUD.overlays += build_maptext(string,KHUD.color,KHUD.layer + 2,KHUD.maptext_x,KHUD.maptext_y)
relocate(ID,SCREEN_LOC,DIR,VALUE)
var/client/c = usr.client
if(c.hud.Find(ID))
var/khud/KHUD = src.hud[ID]
if(SCREEN_LOC)
if(DIR!=null)
KHUD.screen_loc = "[screen_loc_math(SCREEN_LOC,DIR,VALUE)]"
else
KHUD.screen_loc = "[SCREEN_LOC]"
screen |= KHUD
return TRUE
add_text(ID, STRING = null, px = 0, py = 0)
var/khud/KHUD = src.hud[ID]
if(KHUD)
KHUD.overlays = list()
KHUD.overlays += build_maptext(STRING,"#000000",KHUD.layer + 1,px,py+1)
KHUD.overlays += build_maptext(STRING,"#000000",KHUD.layer + 1,px,py-1)
KHUD.overlays += build_maptext(STRING,"#000000",KHUD.layer + 1,px+1,py)
KHUD.overlays += build_maptext(STRING,"#000000",KHUD.layer + 1,px-1,py)
KHUD.overlays += build_maptext(STRING,KHUD.color,KHUD.layer + 2,px,py)
clean_text(ID)
var/khud/KHUD = src.hud[ID]
KHUD.overlays = list()
clean_container_text(ID)
var/khud/KHUD = src.containers[ID]
for(var/khud/HUD in KHUD.container)
HUD.overlays = list()
move_hud( ID , DIR = null , SIZE = 0)
if(ID && DIR && SIZE)
var/khud/KHUD = src.hud[ID]
if(KHUD.container.len > 0)
for(var/khud/HUD in KHUD.container)
HUD.screen_loc = "[screen_loc_math(KHUD.screen_loc,DIR,SIZE)]"
else
KHUD.screen_loc = "[screen_loc_math(KHUD.screen_loc,DIR,SIZE)]"
add_hud( ID , khud/KHUD , LOC = null , VISIBLE = FALSE ,LAYER )
if(!(src.hud.Find(ID)))
KHUD.ID = ID
src.hud[ID] = KHUD
if(LAYER)
KHUD.layer = LAYER
if(VISIBLE)
src.screen |= KHUD
if(LOC)
KHUD.screen_loc = "[LOC]"
add_container( ID )
if(!(src.containers.Find(ID)))
var/khud/KHUD = new
KHUD.ID = ID
src.containers[ID] = KHUD
for(var/ARG in args.Copy(2))
if(src.hud.Find(ARG))
var/khud/HUD = src.hud[ARG]
HUD.parent = KHUD
KHUD.container |= HUD
else
var/khud/KHUD = src.containers[ID]
var/khud/HUD
for(var/ARG in args.Copy(2))
if(src.hud.Find(ARG))
HUD = src.hud[ARG]
HUD.parent = KHUD
KHUD.container |= HUD
remove_container( ID )
if(src.containers.Find(ID))
var/khud/KHUD = src.containers[ID]
for(var/khud/HUD in KHUD.container)
HUD.parent = null
src.containers -= ID
hide_hud()
var/khud/KHUD
for(var/ARG in args)
if(src.containers.Find(ARG))
KHUD = src.containers[ARG]
if(KHUD)
for(var/khud/HUD in KHUD.container)
src.screen -= HUD
continue
if(src.hud.Find(ARG))
KHUD = src.hud[ARG]
if(KHUD)
src.screen -= KHUD
show_hud()
var/khud/KHUD
for(var/ARG in args)
if(src.containers.Find(ARG))
KHUD = src.containers[ARG]
if(KHUD)
for(var/khud/HUD in KHUD.container)
src.screen |= HUD
continue
if(src.hud.Find(ARG))
KHUD = src.hud[ARG]
if(KHUD)
src.screen |= KHUD
fade_hud()
var/khud/KHUD
. = args.Copy(2)
for(var/ARG in .)
if(src.containers.Find(ARG))
KHUD = src.containers[ARG]
if(KHUD)
for(var/khud/HUD in KHUD.container)
HUD.alpha = 255
animate(HUD,alpha=0,time=args[1])
spawn(args[1])
src.screen -= HUD
continue
if(src.hud.Find(ARG))
KHUD = src.hud[ARG]
if(KHUD)
KHUD.alpha = 255
animate(KHUD,alpha=0,time=args[1])
spawn(args[1])
if(KHUD.alpha==0)
src.screen -= KHUD
fade_in_hud()
var/khud/KHUD
. = args.Copy(2)
for(var/ARG in .)
if(src.containers.Find(ARG))
KHUD = src.containers[ARG]
if(KHUD)
for(var/khud/HUD in KHUD.container)
HUD.alpha = 0
animate(HUD,alpha=255,time=args[1])
src.screen |= HUD
continue
if(src.hud.Find(ARG))
KHUD = src.hud[ARG]
if(KHUD)
KHUD.alpha = 0
animate(KHUD,alpha=255,time=args[1])
src.screen |= KHUD
proc
build_maptext(string="",COLOR=null,LAYER=0,PX=0,PY=0)
var/obj/O = new/obj{maptext_width=1024;maptext_height=16}
O.maptext = "<font face=Arial>[string]"
O.color = COLOR
O.layer = LAYER
O.maptext_x = PX
O.maptext_y = PY
. = O
khud
parent_type = /obj
var
ID = ""
khud/parent = null
list
container[] = new
text
layer = 105