* [READY] Several fixes/changes to mood, longterm mood effects, beauty component (#36344) cl Floyd / Qustinnus del: Removes short-term effects of mood add; Adds long-term effects of mood by implementing sanity which goes up with good mood, down with bad mood, but takes time to change. Your sanity can be seen as your average mood in the recent past. All effects of moods are now covered by this system add: Beauty component, currently only attached to cleanables, but you could attach it to any atom/movable and make them pretty/ugly, affecting mood of anyone in the room. refactor: Removes the original way of adding mood events, uses signals properly instead. fix: Cleanables "giving" area's free beauty during initialization fix: Fixes some events not clearing properly /cl Fixes #36444 From now on mood no longer affects you directly, instead it decides whether your sanity goes up or down, when your sanity gets too low you will get the effects of what mood did before. This means getting hit with bad moods due to being attacked while not mean you are doomed anymore, and you get a large timeframe to get away and just fix your mood later. I also added the beauty component, you could add this to any object and it would either make a room prettier or uglier, comparable to DF or Rimworld. You could add traits to make certain people ugly, for example. * [READY] Several fixes/changes to mood, longterm mood effects, beauty component
223 lines
7.3 KiB
Plaintext
223 lines
7.3 KiB
Plaintext
#define AREA_ERRNONE 0
|
|
#define AREA_STATION 1
|
|
#define AREA_SPACE 2
|
|
#define AREA_SPECIAL 3
|
|
|
|
/obj/item/areaeditor
|
|
name = "area modification item"
|
|
icon = 'icons/obj/items_and_weapons.dmi'
|
|
icon_state = "blueprints"
|
|
attack_verb = list("attacked", "bapped", "hit")
|
|
var/fluffnotice = "Nobody's gonna read this stuff!"
|
|
|
|
/obj/item/areaeditor/attack_self(mob/user)
|
|
add_fingerprint(user)
|
|
. = "<BODY><HTML><head><title>[src]</title></head> \
|
|
<h2>[station_name()] [src.name]</h2> \
|
|
<small>[fluffnotice]</small><hr>"
|
|
switch(get_area_type())
|
|
if(AREA_SPACE)
|
|
. += "<p>According to the [src.name], you are now in an unclaimed territory.</p>"
|
|
if(AREA_SPECIAL)
|
|
. += "<p>This place is not noted on the [src.name].</p>"
|
|
. += "<p><a href='?src=[REF(src)];create_area=1'>Create or modify an existing area</a></p>"
|
|
|
|
|
|
/obj/item/areaeditor/Topic(href, href_list)
|
|
if(..())
|
|
return
|
|
if(!usr.canUseTopic(src))
|
|
usr << browse(null, "window=blueprints")
|
|
return
|
|
if(href_list["create_area"])
|
|
create_area(usr)
|
|
updateUsrDialog()
|
|
|
|
//Station blueprints!!!
|
|
/obj/item/areaeditor/blueprints
|
|
name = "station blueprints"
|
|
desc = "Blueprints of the station. There is a \"Classified\" stamp and several coffee stains on it."
|
|
icon = 'icons/obj/items_and_weapons.dmi'
|
|
icon_state = "blueprints"
|
|
fluffnotice = "Property of Nanotrasen. For heads of staff only. Store in high-secure storage."
|
|
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
|
var/list/image/showing = list()
|
|
var/client/viewing
|
|
var/legend = FALSE //Viewing the wire legend
|
|
|
|
|
|
/obj/item/areaeditor/blueprints/Destroy()
|
|
clear_viewer()
|
|
return ..()
|
|
|
|
|
|
/obj/item/areaeditor/blueprints/attack_self(mob/user)
|
|
. = ..()
|
|
if(!legend)
|
|
var/area/A = get_area()
|
|
if(get_area_type() == AREA_STATION)
|
|
. += "<p>According to \the [src], you are now in <b>\"[html_encode(A.name)]\"</b>.</p>"
|
|
. += "<p><a href='?src=[REF(src)];edit_area=1'>Change area name</a></p>"
|
|
. += "<p><a href='?src=[REF(src)];view_legend=1'>View wire colour legend</a></p>"
|
|
if(!viewing)
|
|
. += "<p><a href='?src=[REF(src)];view_blueprints=1'>View structural data</a></p>"
|
|
else
|
|
. += "<p><a href='?src=[REF(src)];refresh=1'>Refresh structural data</a></p>"
|
|
. += "<p><a href='?src=[REF(src)];hide_blueprints=1'>Hide structural data</a></p>"
|
|
else
|
|
if(legend == TRUE)
|
|
. += "<a href='?src=[REF(src)];exit_legend=1'><< Back</a>"
|
|
. += view_wire_devices(user);
|
|
else
|
|
//legend is a wireset
|
|
. += "<a href='?src=[REF(src)];view_legend=1'><< Back</a>"
|
|
. += view_wire_set(user, legend)
|
|
var/datum/browser/popup = new(user, "blueprints", "[src]", 700, 500)
|
|
popup.set_content(.)
|
|
popup.open()
|
|
onclose(user, "blueprints")
|
|
|
|
|
|
/obj/item/areaeditor/blueprints/Topic(href, href_list)
|
|
..()
|
|
if(href_list["edit_area"])
|
|
if(get_area_type()!=AREA_STATION)
|
|
return
|
|
edit_area()
|
|
if(href_list["exit_legend"])
|
|
legend = FALSE;
|
|
if(href_list["view_legend"])
|
|
legend = TRUE;
|
|
if(href_list["view_wireset"])
|
|
legend = href_list["view_wireset"];
|
|
if(href_list["view_blueprints"])
|
|
set_viewer(usr, "<span class='notice'>You flip the blueprints over to view the complex information diagram.</span>")
|
|
if(href_list["hide_blueprints"])
|
|
clear_viewer(usr,"<span class='notice'>You flip the blueprints over to view the simple information diagram.</span>")
|
|
if(href_list["refresh"])
|
|
clear_viewer(usr)
|
|
set_viewer(usr)
|
|
|
|
attack_self(usr) //this is not the proper way, but neither of the old update procs work! it's too ancient and I'm tired shush.
|
|
|
|
/obj/item/areaeditor/blueprints/proc/get_images(turf/T, viewsize)
|
|
. = list()
|
|
for(var/tt in RANGE_TURFS(viewsize, T))
|
|
var/turf/TT = tt
|
|
if(TT.blueprint_data)
|
|
. += TT.blueprint_data
|
|
|
|
/obj/item/areaeditor/blueprints/proc/set_viewer(mob/user, message = "")
|
|
if(user && user.client)
|
|
if(viewing)
|
|
clear_viewer()
|
|
viewing = user.client
|
|
showing = get_images(get_turf(user), viewing.view)
|
|
viewing.images |= showing
|
|
if(message)
|
|
to_chat(user, message)
|
|
|
|
/obj/item/areaeditor/blueprints/proc/clear_viewer(mob/user, message = "")
|
|
if(viewing)
|
|
viewing.images -= showing
|
|
viewing = null
|
|
showing.Cut()
|
|
if(message)
|
|
to_chat(user, message)
|
|
|
|
/obj/item/areaeditor/blueprints/dropped(mob/user)
|
|
..()
|
|
clear_viewer()
|
|
legend = FALSE
|
|
|
|
|
|
/obj/item/areaeditor/proc/get_area()
|
|
var/turf/T = get_turf(usr)
|
|
var/area/A = T.loc
|
|
return A
|
|
|
|
/obj/item/areaeditor/proc/get_area_type(area/A = get_area())
|
|
if(A.outdoors)
|
|
return AREA_SPACE
|
|
var/list/SPECIALS = list(
|
|
/area/shuttle,
|
|
/area/admin,
|
|
/area/arrival,
|
|
/area/centcom,
|
|
/area/asteroid,
|
|
/area/tdome,
|
|
/area/wizard_station
|
|
)
|
|
for (var/type in SPECIALS)
|
|
if ( istype(A,type) )
|
|
return AREA_SPECIAL
|
|
return AREA_STATION
|
|
|
|
/obj/item/areaeditor/blueprints/proc/view_wire_devices(mob/user)
|
|
var/message = "<br>You examine the wire legend.<br>"
|
|
for(var/wireset in GLOB.wire_color_directory)
|
|
message += "<br><a href='?src=[REF(src)];view_wireset=[wireset]'>[GLOB.wire_name_directory[wireset]]</a>"
|
|
message += "</p>"
|
|
return message
|
|
|
|
/obj/item/areaeditor/blueprints/proc/view_wire_set(mob/user, wireset)
|
|
//for some reason you can't use wireset directly as a derefencer so this is the next best :/
|
|
for(var/device in GLOB.wire_color_directory)
|
|
if("[device]" == wireset) //I know... don't change it...
|
|
var/message = "<p><b>[GLOB.wire_name_directory[device]]:</b>"
|
|
for(var/Col in GLOB.wire_color_directory[device])
|
|
var/wire_name = GLOB.wire_color_directory[device][Col]
|
|
if(!findtext(wire_name, WIRE_DUD_PREFIX)) //don't show duds
|
|
message += "<p><span style='color: [Col]'>[Col]</span>: [wire_name]</p>"
|
|
message += "</p>"
|
|
return message
|
|
return ""
|
|
|
|
/obj/item/areaeditor/proc/edit_area()
|
|
var/area/A = get_area()
|
|
var/prevname = "[A.name]"
|
|
var/str = stripped_input(usr,"New area name:", "Area Creation", "", MAX_NAME_LEN)
|
|
if(!str || !length(str) || str==prevname) //cancel
|
|
return
|
|
if(length(str) > 50)
|
|
to_chat(usr, "<span class='warning'>The given name is too long. The area's name is unchanged.</span>")
|
|
return
|
|
set_area_machinery_title(A,str,prevname)
|
|
for(var/area/RA in A.related)
|
|
RA.name = str
|
|
if(RA.firedoors)
|
|
for(var/D in RA.firedoors)
|
|
var/obj/machinery/door/firedoor/FD = D
|
|
FD.CalculateAffectingAreas()
|
|
to_chat(usr, "<span class='notice'>You rename the '[prevname]' to '[str]'.</span>")
|
|
log_game("[key_name(usr)] has renamed [prevname] to [str]")
|
|
A.update_areasize()
|
|
interact()
|
|
return 1
|
|
|
|
|
|
/obj/item/areaeditor/proc/set_area_machinery_title(area/A,title,oldtitle)
|
|
if(!oldtitle) // or replacetext goes to infinite loop
|
|
return
|
|
for(var/area/RA in A.related)
|
|
for(var/obj/machinery/airalarm/M in RA)
|
|
M.name = replacetext(M.name,oldtitle,title)
|
|
for(var/obj/machinery/power/apc/M in RA)
|
|
M.name = replacetext(M.name,oldtitle,title)
|
|
for(var/obj/machinery/atmospherics/components/unary/vent_scrubber/M in RA)
|
|
M.name = replacetext(M.name,oldtitle,title)
|
|
for(var/obj/machinery/atmospherics/components/unary/vent_pump/M in RA)
|
|
M.name = replacetext(M.name,oldtitle,title)
|
|
for(var/obj/machinery/door/M in RA)
|
|
M.name = replacetext(M.name,oldtitle,title)
|
|
//TODO: much much more. Unnamed airlocks, cameras, etc.
|
|
|
|
//Blueprint Subtypes
|
|
|
|
/obj/item/areaeditor/blueprints/cyborg
|
|
name = "station schematics"
|
|
desc = "A digital copy of the station blueprints stored in your memory."
|
|
icon = 'icons/obj/items_and_weapons.dmi'
|
|
icon_state = "blueprints"
|
|
fluffnotice = "Intellectual Property of Nanotrasen. For use in engineering cyborgs only. Wipe from memory upon departure from the station."
|