RCD overhaul (#37413)

* basics

* floors

* to the windowwwwwwwwwwwwwww

* icon fixes and wood walls

* DOOR STUCK

* dumb fix lmao

* DOOR STUCK

* wow guys linters are so fucking cool

* fixed some scuff, new buildables

* windoors, girders, removed useless changes

* relative path fix

* more lint

* vars moved to parent object

* borg

* mechs

* code cleanup

* suggested changes

---------

Co-authored-by: west3436 <66280799+west3436@users.noreply.github.com>
This commit is contained in:
CrazyAmphibian
2025-02-19 15:49:58 -08:00
committed by GitHub
parent fca7430937
commit 7df8069e61
5 changed files with 1806 additions and 7 deletions

View File

@@ -38,10 +38,21 @@
var/datum/html_interface/rcd/interface
var/obj/abstract/screen/close/closer
var/list/settings //for stuff like window directions and construction options.
var/current_menu=null //we are keeping both systems of schematics for the sake of backwards compatability
var/list/schem_groups=null
var/datum/rcd_grouped_schematic/selected_schem=null
/obj/item/device/rcd/New()
. = ..()
schem_groups=new()
settings=new()
//interface gets created BEFORE the schematics get created, so they can modify the HEAD content (RPD pipe colour picker).
interface = new(src, sanitize(name))
data = list()
@@ -368,8 +379,159 @@
/datum/rcd_schematic/con_walls,
/datum/rcd_schematic/con_airlock,
/datum/rcd_schematic/con_window,
)
)
current_menu="deconstruct"
/obj/item/device/rcd/mech/attack_self(var/mob/living/user)
if(!selected || user.shown_schematics_background || !selected.show(user))
user.hud_used.toggle_show_schematics_display(schematics["Construction"], 0, src)
/obj/item/device/rcd/mech/New()
. = ..()
rcd_list += src
var/datum/rcd_scematic_grouping/destroy/dest_g = new(src)
dest_g.schematics+= new /datum/rcd_grouped_schematic/destroy_all(src)
schem_groups+=dest_g
schem_groups+= new /datum/rcd_scematic_grouping/build_wall/engi_std(src)
schem_groups+= new /datum/rcd_scematic_grouping/build_floors/engi_std(src)
schem_groups+= new /datum/rcd_scematic_grouping/build_airlock/engi_std(src)
schem_groups+=new /datum/rcd_scematic_grouping/build_windows/engi_std(src)
current_menu=schem_groups[1].name
schem_groups[1].switch_to()
/obj/item/device/rcd/mech/attack_self(var/mob/user)
rebuild_ui()
interface.show(user)
for(var/datum/rcd_scematic_grouping/schemgroup in schem_groups)
schemgroup.send_assets(user.client)
for(var/datum/rcd_grouped_schematic/sch)
sch.send_assets(user.client)
interface.hide(user) //have to do this since loading so many images takes a lot of time. and no images is better than no UI
interface.show(user)
/obj/item/device/rcd/mech/Topic(var/href, var/list/href_list)
//for(var/i in href_list)
// world.log << "[i] = [href_list[i]]"
if(href_list["set_group"])
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(schem_group.name==href_list["set_group"])
current_menu=href_list["set_group"]
schem_group.switch_to()
do_spark()
rebuild_ui()
return
if(href_list["set_schematic"])
var/datum/rcd_scematic_grouping/group
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(schem_group.name==current_menu)
group=schem_group
break
if(group)
for(var/datum/rcd_grouped_schematic/schm in group.schematics)
if(schm.name==href_list["set_schematic"])
selected_schem=schm
do_spark()
rebuild_ui()
break
return
if(href_list["set_arg"])
if(href_list["value_togglelist"])
var/val = href_list["value_isnum"]=="yes" ? text2num(href_list["value"]) : href_list["value"]
var/found=FALSE
for(var/n in settings[href_list["set_arg"]])
if(n==val)
found=TRUE
break
if( found )
settings[href_list["set_arg"]] -= val
else
settings[href_list["set_arg"]] += val
else if(href_list["value_resetlist"])
settings[href_list["set_arg"]]=new /list()
else if(href_list["value_toggle"] )
settings[href_list["set_arg"]] = ! settings[href_list["set_arg"]]
else if (href_list["value_input"])
var/tx=""
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(schem_group.name==current_menu)
tx=schem_group.selectiondialogue
break
settings[href_list["set_arg"]] = input(usr, tx, src, "[selected_schem?.name]")
else
settings[href_list["set_arg"]] = href_list["value_isnum"]=="yes" ? text2num(href_list["value"]) : href_list["value"]
rebuild_ui()
return
return
/obj/item/device/rcd/mech/rebuild_ui()
var/dat=""
//that's right, you can embed a stylesheet in the html body, and you better believe i'm going to do this instead of setting up a whole new file for like 2 rules.
dat+={"<style>
.grouplisting{
text-align:center;
font-size:100%;
}
.grouplisting img {
width:64px;
height:64px;
}
.grouplisting a{
width:100%;
height:100%;
display:block;
background:revert;
}
.clickabletable td{
text-align:center;
height:100%; /*to make it so that links inhabit the whole size of the td. kinda annoying to have to do all this.*/
}
.clickabletable a{
width:100%;
height:100%;
display:block;
}
img, .clickabletable img, .grouplisting img {
border:none;
background:none;
image-rendering:pixelated;
}
</style>"}
dat+="<table class='grouplisting'><tr>"
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
dat+="<td class='[schem_group.name==current_menu ? "schem_selected" : "schem" ]'><a href='?src=\ref[interface];set_group=[schem_group.name]'><img src='[schem_group.headerimage]'><br>[schem_group.name]</a></td>"
dat+="</tr></table><hr>"
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(schem_group.name==current_menu)
var/t=schem_group.generate_html()
dat+=t
break
interface.updateLayout(dat)
/obj/item/device/rcd/mech/afterattack(var/atom/A, var/mob/user)
if(!selected_schem)
return 1
if( !(user.Adjacent(A) && A.Adjacent(user)) )
return 1
if(get_dist(A, user) > 1)
return 1
var/c=selected_schem.build(A,user)
if(!c)
to_chat(user, "<span class='warning'>\The [src]'s error light flickers.</span>")
else
use_energy(c, user)
rebuild_ui()
return 1

View File

@@ -6,11 +6,32 @@
/datum/rcd_schematic/con_airlock,
/datum/rcd_schematic/con_window,
)
current_menu="deconstruct"
/obj/item/device/rcd/matter/engineering/New()
/obj/item/device/rcd/matter/engineering/New(var/loc=null,var/no_schematics=FALSE)
. = ..()
rcd_list += src
if(!no_schematics)
var/datum/rcd_scematic_grouping/destroy/dest_g = new(src)
dest_g.schematics+= new /datum/rcd_grouped_schematic/destroy_all(src)
var/datum/rcd_scematic_grouping/build_wall/engi_std/wall_g = new(src)
var/datum/rcd_scematic_grouping/build_floors/engi_std/floor_g = new(src)
var/datum/rcd_scematic_grouping/build_windows/engi_std/window_g = new(src)
var/datum/rcd_scematic_grouping/build_airlock/engi_std/airlock_g=new(src)
schem_groups+=dest_g
schem_groups+=wall_g
schem_groups+=floor_g
schem_groups+=airlock_g
schem_groups+=window_g
current_menu=schem_groups[1].name
schem_groups[1].switch_to()
/obj/item/device/rcd/matter/engineering/Destroy()
. = ..()
rcd_list -= src
@@ -20,16 +41,159 @@
return
return ..()
/obj/item/device/rcd/matter/engineering/attack_self(var/mob/user)
rebuild_ui()
interface.show(user)
for(var/datum/rcd_scematic_grouping/schemgroup in schem_groups)
schemgroup.send_assets(user.client)
for(var/datum/rcd_grouped_schematic/sch)
sch.send_assets(user.client)
interface.hide(user) //have to do this since loading so many images takes a lot of time. and no images is better than no UI
interface.show(user)
/obj/item/device/rcd/matter/engineering/Topic(var/href, var/list/href_list)
if(href_list["set_group"])
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(schem_group.name==href_list["set_group"])
current_menu=href_list["set_group"]
schem_group.switch_to()
do_spark()
rebuild_ui()
return
if(href_list["set_schematic"])
var/datum/rcd_scematic_grouping/group
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(schem_group.name==current_menu)
group=schem_group
break
if(group)
for(var/datum/rcd_grouped_schematic/schm in group.schematics)
if(schm.name==href_list["set_schematic"])
selected_schem=schm
do_spark()
rebuild_ui()
break
return
if(href_list["set_arg"])
if(href_list["value_togglelist"])
var/val = href_list["value_isnum"]=="yes" ? text2num(href_list["value"]) : href_list["value"]
var/found=FALSE
for(var/n in settings[href_list["set_arg"]])
if(n==val)
found=TRUE
break
if( found )
settings[href_list["set_arg"]] -= val
else
settings[href_list["set_arg"]] += val
else if(href_list["value_resetlist"])
settings[href_list["set_arg"]]=new /list()
else if(href_list["value_toggle"] )
settings[href_list["set_arg"]] = ! settings[href_list["set_arg"]]
else if (href_list["value_input"])
var/tx=""
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(schem_group.name==current_menu)
tx=schem_group.selectiondialogue
break
settings[href_list["set_arg"]] = input(usr, tx, src, "[selected_schem?.name]")
else
settings[href_list["set_arg"]] = href_list["value_isnum"]=="yes" ? text2num(href_list["value"]) : href_list["value"]
rebuild_ui()
return
return
/obj/item/device/rcd/matter/engineering/rebuild_ui()
var/dat=""
dat+="Compressed Matter: [matter]/[max_matter]<hr>"
//that's right, you can embed a stylesheet in the html body, and you better believe i'm going to do this instead of setting up a whole new file for like 2 rules.
dat+={"<style>
.grouplisting{
text-align:center;
font-size:100%;
}
.grouplisting img {
width:64px;
height:64px;
}
.grouplisting a{
width:100%;
height:100%;
display:block;
background:revert;
}
.clickabletable td{
text-align:center;
height:100%; /*to make it so that links inhabit the whole size of the td. kinda annoying to have to do all this.*/
}
.clickabletable a{
width:100%;
height:100%;
display:block;
}
img, .clickabletable img, .grouplisting img {
border:none;
background:none;
image-rendering:pixelated;
}
</style>"}
dat+="<table class='grouplisting'><tr>"
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
dat+="<td class='[schem_group.name==current_menu ? "schem_selected" : "schem" ]'><a href='?src=\ref[interface];set_group=[schem_group.name]'><img src='[schem_group.headerimage]'><br>[schem_group.name]</a></td>"
dat+="</tr></table><hr>"
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(schem_group.name==current_menu)
var/t=schem_group.generate_html()
dat+=t
break
interface.updateLayout(dat)
/obj/item/device/rcd/matter/engineering/afterattack(var/atom/A, var/mob/user)
if(!selected_schem)
return 1
if( !(user.Adjacent(A) && A.Adjacent(user)) )
return 1
if(get_dist(A, user) > 1)
return 1
var/c=selected_schem.build(A,user)
if(!c)
to_chat(user, "<span class='warning'>\The [src]'s error light flickers.</span>")
else
use_energy(c, user)
rebuild_ui()
return 1
/obj/item/device/rcd/matter/engineering/suicide_act(var/mob/living/user)
visible_message("<span class='danger'>[user] is using the deconstruct function on \the [src] on \himself! It looks like \he's trying to commit suicide!</span>")
user.death(1)
return SUICIDE_ACT_CUSTOM
/obj/item/device/rcd/matter/engineering/pre_loaded/New() //Comes with max energy
..()
/obj/item/device/rcd/matter/engineering/pre_loaded/New(var/loc=null,var/no_schematics=FALSE) //Comes with max energy
..(loc,no_schematics)
matter = max_matter
/obj/item/device/rcd/borg/engineering
schematics = list(
/datum/rcd_schematic/decon,
@@ -38,6 +202,188 @@
/datum/rcd_schematic/con_airlock/borg,
/datum/rcd_schematic/con_window/borg,
)
var/matter=0
current_menu="deconstruct"
/obj/item/device/rcd/borg/engineering/New()
. = ..()
rcd_list += src
var/datum/rcd_scematic_grouping/destroy/dest_g = new(src)
dest_g.schematics+= new /datum/rcd_grouped_schematic/destroy_all(src)
schem_groups+=dest_g
schem_groups+=new /datum/rcd_scematic_grouping/build_wall/engi_std(src)
schem_groups+=new /datum/rcd_scematic_grouping/build_floors/engi_std(src)
schem_groups+=new /datum/rcd_scematic_grouping/build_airlock/engi_std(src)
schem_groups+=new /datum/rcd_scematic_grouping/build_windows/engi_std(src)
current_menu=schem_groups[1].name
schem_groups[1].switch_to()
/obj/item/device/rcd/borg/engineering/attack_self(var/mob/user)
if(!isrobot(user))
return
var/mob/living/silicon/robot/R = user
if(!R.cell)
matter=0
else
matter=R.cell.charge / cell_power_per_energy
rebuild_ui()
interface.show(user)
for(var/datum/rcd_scematic_grouping/schemgroup in schem_groups)
schemgroup.send_assets(user.client)
for(var/datum/rcd_grouped_schematic/sch)
sch.send_assets(user.client)
interface.hide(user) //have to do this since loading so many images takes a lot of time. and no images is better than no UI
interface.show(user)
/obj/item/device/rcd/borg/engineering/Topic(var/href, var/list/href_list)
//for(var/i in href_list)
// world.log << "[i] = [href_list[i]]"
if(href_list["set_group"])
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(schem_group.name==href_list["set_group"])
current_menu=href_list["set_group"]
schem_group.switch_to()
do_spark()
rebuild_ui()
return
if(href_list["set_schematic"])
var/datum/rcd_scematic_grouping/group
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(schem_group.name==current_menu)
group=schem_group
break
if(group)
for(var/datum/rcd_grouped_schematic/schm in group.schematics)
if(schm.name==href_list["set_schematic"])
selected_schem=schm
do_spark()
rebuild_ui()
break
return
if(href_list["set_arg"])
if(href_list["value_togglelist"])
var/val = href_list["value_isnum"]=="yes" ? text2num(href_list["value"]) : href_list["value"]
var/found=FALSE
for(var/n in settings[href_list["set_arg"]])
if(n==val)
found=TRUE
break
if( found )
settings[href_list["set_arg"]] -= val
else
settings[href_list["set_arg"]] += val
else if(href_list["value_resetlist"])
settings[href_list["set_arg"]]=new /list()
else if(href_list["value_toggle"] )
settings[href_list["set_arg"]] = ! settings[href_list["set_arg"]]
else if (href_list["value_input"])
var/tx=""
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(schem_group.name==current_menu)
tx=schem_group.selectiondialogue
break
settings[href_list["set_arg"]] = input(usr, tx, src, "[selected_schem?.name]")
else
settings[href_list["set_arg"]] = href_list["value_isnum"]=="yes" ? text2num(href_list["value"]) : href_list["value"]
rebuild_ui()
return
return
/obj/item/device/rcd/borg/engineering/rebuild_ui()
var/dat=""
dat+="Charge: [floor(matter)]<hr>"
//that's right, you can embed a stylesheet in the html body, and you better believe i'm going to do this instead of setting up a whole new file for like 2 rules.
dat+={"<style>
.grouplisting{
text-align:center;
font-size:100%;
}
.grouplisting img {
width:64px;
height:64px;
}
.grouplisting a{
width:100%;
height:100%;
display:block;
background:revert;
}
.clickabletable td{
text-align:center;
height:100%; /*to make it so that links inhabit the whole size of the td. kinda annoying to have to do all this.*/
}
.clickabletable a{
width:100%;
height:100%;
display:block;
}
img, .clickabletable img, .grouplisting img {
border:none;
background:none;
image-rendering:pixelated;
}
</style>"}
dat+="<table class='grouplisting'><tr>"
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
dat+="<td class='[schem_group.name==current_menu ? "schem_selected" : "schem" ]'><a href='?src=\ref[interface];set_group=[schem_group.name]'><img src='[schem_group.headerimage]'><br>[schem_group.name]</a></td>"
dat+="</tr></table><hr>"
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(schem_group.name==current_menu)
var/t=schem_group.generate_html()
dat+=t
break
interface.updateLayout(dat)
/obj/item/device/rcd/borg/engineering/afterattack(var/atom/A, var/mob/user)
if(!selected_schem)
return 1
if( !(user.Adjacent(A) && A.Adjacent(user)) )
return 1
if(get_dist(A, user) > 1)
return 1
if(!isrobot(user))
return 1
var/mob/living/silicon/robot/R = user
if(!R.cell)
matter=0
else
matter=R.cell.charge / cell_power_per_energy
var/c=selected_schem.build(A,user)
if(!c)
to_chat(user, "<span class='warning'>\The [src]'s error light flickers.</span>")
else
use_energy(c, user)
if(!R.cell)
matter=0
else
matter=R.cell.charge / cell_power_per_energy
rebuild_ui()
return 1
/obj/item/device/rcd/matter/engineering/pre_loaded/adv
name = "advanced Rapid-Construction-Device (RCD)"
@@ -58,6 +404,23 @@
slimeadd_message = "You put the slime extract on the SRCTAG's compressed matter slot"
slimes_accepted = SLIME_DARKPURPLE
slimeadd_success_message = "It gains a distinct plasma pink hue"
/obj/item/device/rcd/matter/engineering/pre_loaded/adv/New(var/loc=null,var/no_schematics=FALSE)
..(loc,TRUE)
if(!no_schematics)
var/datum/rcd_scematic_grouping/destroy/dest_g = new(src)
dest_g.schematics+= new /datum/rcd_grouped_schematic/destroy_all(src)
schem_groups+=dest_g
schem_groups+=new /datum/rcd_scematic_grouping/build_wall/engi_std/CE(src)
schem_groups+=new /datum/rcd_scematic_grouping/build_floors/engi_std/CE(src)
schem_groups+=new /datum/rcd_scematic_grouping/build_airlock/engi_std/CE(src)
schem_groups+=new /datum/rcd_scematic_grouping/build_windows/engi_std(src)
current_menu=schem_groups[1].name
schem_groups[1].switch_to()
/obj/item/device/rcd/matter/engineering/pre_loaded/adv/slime_act(primarytype, mob/user)
. = ..()
@@ -66,6 +429,15 @@
if(!schematics[P.category])
schematics[P.category] = list()
schematics[P.category] += P
for(var/datum/rcd_scematic_grouping/schem_group in schem_groups)
if(istype(schem_group,/datum/rcd_scematic_grouping/build_windows) )
schem_group.schematics+=new /datum/rcd_grouped_schematic/glass/plasma(src)
schem_group.schematics+=new /datum/rcd_grouped_schematic/glass/rplas(src)
if(istype(schem_group,/datum/rcd_scematic_grouping/build_floors) )
schem_group.schematics+= new/datum/rcd_grouped_schematic/plasmaglassfloor(src)
rebuild_ui()
/obj/item/device/rcd/matter/engineering/pre_loaded/adv/delay(var/mob/user, var/atom/target, var/amount)
return do_after(user, target, amount/2)

View File

@@ -135,3 +135,53 @@ params:
return "<table class=[class]><tr>[fav_html]<td><a href='?src=\ref[interface];schematic=\ref[src];act=select' >[image_html][name]</a><td><tr></table>"
/datum/rcd_schematic/proc/MouseWheeled(var/mob/user, var/delta_x, var/delta_y, var/params)
/datum/rcd_scematic_grouping
var/name = "group" //what's displayed
var/list/schematics
var/obj/item/device/rcd/linked_rcd=null
var/headerimage="" //make sure you send_assets the image first, dummy
var/selectiondialogue="enter text"
/datum/rcd_scematic_grouping/New(var/obj/item/device/rcd/rcdtouse=null)
linked_rcd=rcdtouse
schematics=new()
return src
/datum/rcd_scematic_grouping/proc/switch_to()
return
/datum/rcd_scematic_grouping/proc/generate_html()
var/dat=""
for(var/datum/rcd_grouped_schematic/schem in schematics)
dat+=schem.generate_html()
return dat
/datum/rcd_scematic_grouping/proc/send_assets(var/client/client)
return
/datum/rcd_grouped_schematic
var/name = "schematic" //what's displayed
var/cost = 0 //cost is determined by the build proc, to support upgrading having less cost than building whole.
var/obj/item/device/rcd/linked_rcd=null
/datum/rcd_grouped_schematic/New(var/obj/item/device/rcd/rcdtouse=null)
linked_rcd=rcdtouse
return src
/datum/rcd_grouped_schematic/proc/generate_html()
return ""
/datum/rcd_grouped_schematic/proc/build(var/atom/A, var/mob/user)
return 0
/datum/rcd_grouped_schematic/proc/send_assets(var/client/client)
//register_asset("test.png", new/icon('thing.dmi', "state" ))
//send_asset(client, "test.png")
return

File diff suppressed because it is too large Load Diff

View File

@@ -2467,6 +2467,7 @@
#include "code\modules\RCD\schematic.dm"
#include "code\modules\RCD\tile painter.dm"
#include "code\modules\RCD\schematics\engi.dm"
#include "code\modules\RCD\schematics\engineering_rcd.dm"
#include "code\modules\RCD\schematics\pipe.dm"
#include "code\modules\RCD\schematics\rcd_window_spawner.dm"
#include "code\modules\RCD\schematics\service.dm"