diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 493529cede..a05d2aa572 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -5,27 +5,40 @@ plane = DIRTY_PLANE layer = DIRTY_LAYER anchored = TRUE +// CHOMPEdit Start - Pretty much all of this file changed + var/art_type + var/art_color + var/art_shade -/obj/effect/decal/cleanable/crayon/New(location,main = "#FFFFFF",shade = "#000000",var/type = "rune") - ..() - loc = location - +/obj/effect/decal/cleanable/crayon/Initialize(var/ml, main = "#FFFFFF",shade = "#000000",var/type = "rune") + . = ..(ml, 0) // mapload, age name = type desc = "A [type] drawn in crayon." + // Persistence vars. + art_type = type + art_color = main + art_shade = shade + switch(type) if("rune") type = "rune[rand(1,6)]" if("graffiti") type = pick("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa") - var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]",2.1) - var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]s",2.1) + update_icon() - mainOverlay.Blend(main,ICON_ADD) - shadeOverlay.Blend(shade,ICON_ADD) + add_hiddenprint(usr) + +/obj/effect/decal/cleanable/crayon/update_icon() + cut_overlays() + var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[art_type]",2.1) + var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[art_type]s",2.1) + + mainOverlay.Blend(art_color,ICON_ADD) + shadeOverlay.Blend(art_shade,ICON_ADD) add_overlay(mainOverlay) add_overlay(shadeOverlay) - - add_hiddenprint(usr) + return +// CHOMPEdit End diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 9f0ed10b0c..5ee740bb77 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -65,7 +65,7 @@ shadeColour = input(user, "Please select the shade colour.", "Crayon colour") as color return -/obj/item/weapon/pen/crayon/afterattack(atom/target, mob/user as mob, proximity) +/obj/item/weapon/pen/crayon/afterattack(atom/target, mob/user as mob, proximity, click_parameters) // CHOMPEdit - Click parameters if(!proximity) return if(istype(target,/turf/simulated/floor)) var/drawtype = tgui_input_list(user, "Choose what you'd like to draw.", "Crayon scribbles", list("graffiti","rune","letter","arrow")) @@ -95,7 +95,19 @@ return to_chat(user, "You start drawing an arrow on the [target.name].") if(instant || do_after(user, 50)) - new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype) + // CHOMPEdit Start - Better graffiti + //new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype) + var/list/mouse_control = params2list(click_parameters) + var/p_x = 0 + var/p_y = 0 + if(mouse_control["icon-x"]) + p_x = text2num(mouse_control["icon-x"]) - 16 + if(mouse_control["icon-y"]) + p_y = text2num(mouse_control["icon-y"]) - 16 + var/atom/new_graffiti = new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype) + new_graffiti.pixel_x = p_x + new_graffiti.pixel_y = p_y + // CHOMPEdit End to_chat(user, "You finish drawing.") var/msg = "[user.client.key] ([user]) has drawn [drawtype] (with [src]) at [target.x],[target.y],[target.z]." diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index 919ffa7ede..1b9143808f 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -1,4 +1,4 @@ -/turf/simulated/floor/attackby(var/obj/item/C, var/mob/user) +/turf/simulated/floor/attackby(var/obj/item/C, var/mob/user, attack_modifier, click_parameters) // CHOMPAdd - Attack_modifier, click_parameters if(!C || !user) return 0 @@ -7,7 +7,7 @@ var/mob/living/L = user if(L.a_intent != I_HELP) if(L.a_intent == I_GRAB) - try_graffiti(L, C) // back by unpopular demand + try_graffiti(L, C, click_parameters) // back by unpopular demand - CHOMPEdit Add - Click parameters return attack_tile(C, L) // Be on help intent if you want to decon something. return //CHOMPEDIT END diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 3118aa5e03..9c62ce573b 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -127,14 +127,14 @@ return success_smash(user) return fail_smash(user) -/turf/simulated/wall/attackby(var/obj/item/weapon/W, var/mob/user) +/turf/simulated/wall/attackby(var/obj/item/weapon/W, var/mob/user, attack_modifier, click_parameters) // CHOMPEdit - attack_modifier, click_parameters user.setClickCooldown(user.get_attack_speed(W)) /* //As with the floors, only this time it works AND tries pushing the wall after it's done. if(!construction_stage && user.a_intent == I_HELP) - if(try_graffiti(user,W)) + if(try_graffiti(user,W, click_parameters)) // CHOMPEdit - Commented, but- Still. Just in case. return */ @@ -411,5 +411,3 @@ else if(!istype(W,/obj/item/weapon/rcd) && !istype(W, /obj/item/weapon/reagent_containers)) return attack_hand(user) - - diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index e059b2c599..63b8ad2831 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -328,7 +328,7 @@ /turf/proc/can_engrave() return FALSE -/turf/proc/try_graffiti(var/mob/vandal, var/obj/item/tool) +/turf/proc/try_graffiti(var/mob/vandal, var/obj/item/tool, click_parameters) // CHOMPEdt - click_parameters if(!tool || !tool.sharp || !can_engrave()) //CHOMP Edit return FALSE @@ -361,6 +361,20 @@ graffiti.message = message graffiti.author = vandal.ckey + // CHOMPAdd - Cooler graffitis + if(click_parameters) + var/list/mouse_control = params2list(click_parameters) + var/p_x = 0 + var/p_y = 0 + if(mouse_control["icon-x"]) + p_x = text2num(mouse_control["icon-x"]) - 16 + if(mouse_control["icon-y"]) + p_y = text2num(mouse_control["icon-y"]) - 16 + + graffiti.pixel_x = p_x + graffiti.pixel_y = p_y + // CHOMPAdd End + if(lowertext(message) == "elbereth") to_chat(vandal, "You feel much safer.") diff --git a/code/modules/persistence/datum/persistence_datum.dm b/code/modules/persistence/datum/persistence_datum.dm index fb1cb166b9..818363b967 100644 --- a/code/modules/persistence/datum/persistence_datum.dm +++ b/code/modules/persistence/datum/persistence_datum.dm @@ -104,7 +104,7 @@ /datum/persistent/proc/Shutdown() if(fexists(filename)) fdel(filename) - + var/list/to_store = list() for(var/thing in SSpersistence.tracking_values[type]) if(!IsValidEntry(thing)) @@ -121,12 +121,16 @@ var/list/my_tracks = SSpersistence.tracking_values[type] if(!my_tracks?.len) return - + . = list("[capitalize(name)]") . += "
" - + for(var/thing in my_tracks) - . += "[GetAdminDataStringFor(thing, can_modify, user)]" + // CHOMPAdd + var/data = GetAdminDataStringFor(thing, can_modify, user) + if(!isnull(data)) + . += "[GetAdminDataStringFor(thing, can_modify, user)]" + // CHOMPAdd End . += "
" diff --git a/code/modules/persistence/effects/filth.dm b/code/modules/persistence/effects/filth.dm index 0b2a34109b..a8e6469968 100644 --- a/code/modules/persistence/effects/filth.dm +++ b/code/modules/persistence/effects/filth.dm @@ -2,6 +2,17 @@ name = "filth" entries_expire_at = 4 // 4 rounds, 24 hours. var/saves_dirt = TRUE //VOREStation edit + has_admin_data = TRUE // CHOMPEdit + +// CHOMPAdd +/datum/persistent/filth/GetAdminDataStringFor(var/thing, var/can_modify, var/mob/user) + if(istype(thing, /obj/effect/decal/cleanable/crayon)) + var/obj/effect/decal/cleanable/crayon/CRAY = thing + if(can_modify) + return "[thing]Loc:([CRAY.x],[CRAY.y],[CRAY.z]) P_X: [CRAY.pixel_x] P_Y: [CRAY.pixel_y] Color: [CRAY.art_color] Shading: [CRAY.art_shade] Type: [CRAY.art_type]Destroy" + return "[thing]" + return null +// CHOMPEnd /datum/persistent/filth/IsValidEntry(var/atom/entry) . = ..() && entry.invisibility == 0 @@ -9,15 +20,48 @@ /datum/persistent/filth/CheckTokenSanity(var/list/token) // byond's json implementation is "questionable", and uses types as keys and values without quotes sometimes even though they aren't valid json token["path"] = istext(token["path"]) ? text2path(token["path"]) : token["path"] - return ..() && ispath(token["path"]) - + // CHOMPAdd - Cooler graffiti + token["pixel_x"] = istext(token["pixel_x"]) ? text2num(token["pixel_x"]) : token["pixel_x"] + token["pixel_y"] = istext(token["pixel_y"]) ? text2num(token["pixel_y"]) : token["pixel_y"] + return ..() && ispath(token["path"]) && isnum(token["pixel_x"]) && isnum(token["pixel_y"]) + // CHOMPAdd End /datum/persistent/filth/CheckTurfContents(var/turf/T, var/list/token) var/_path = token["path"] - return (locate(_path) in T) ? FALSE : TRUE + // CHOMPEdit Start - Cooler graffitis + // return (locate(_path) in T) ? FALSE : TRUE + if(!ispath(_path, /obj/effect/decal/cleanable/crayon)) + return (locate(_path) in T) ? FALSE : TRUE + +// Crayon drawings aren't handled in graffiti, so we need to check if someone made "art" seperately from blood, dirt, etc. + var/too_much_crayon = 0 + for(var/obj/effect/decal/cleanable/crayon/C in T) + too_much_crayon++ + if(too_much_crayon >= 5) + return FALSE + return TRUE + // CHOMPEdit End /datum/persistent/filth/CreateEntryInstance(var/turf/creating, var/list/token) var/_path = token["path"] - new _path(creating, token["age"]+1) + // CHOMPEdit Start + // new _path(creating, token["age"]+1) + var/atom/inst = new _path(creating, token["age"]+1) + if(token["pixel_x"]) + inst.pixel_x = token["pixel_x"] + if(token["pixel_y"]) + inst.pixel_y = token["pixel_y"] + + if(istype(inst, /obj/effect/decal/cleanable/crayon)) + var/obj/effect/decal/cleanable/crayon/Crayart = inst + if(token["art_type"]) + Crayart.art_type = token["art_type"] + if(token["art_color"]) + Crayart.art_color = token["art_color"] + if(token["art_shade"]) + Crayart.art_shade = token["art_shade"] + + Crayart.update_icon() + // CHOMPEdit End /datum/persistent/filth/GetEntryAge(var/atom/entry) var/obj/effect/decal/cleanable/filth = entry @@ -29,4 +73,20 @@ /datum/persistent/filth/CompileEntry(var/atom/entry) . = ..() - LAZYADDASSOC(., "path", "[GetEntryPath(entry)]") \ No newline at end of file + LAZYADDASSOC(., "path", "[GetEntryPath(entry)]") + // CHOMPAdd Start - Cooler graffiti + to_world("path is [GetEntryPath(entry)]") + LAZYADDASSOC(., "pixel_x", "[entry.pixel_x]") + to_world("pixel_x is [entry.pixel_x]") + LAZYADDASSOC(., "pixel_y", "[entry.pixel_y]") + to_world("pixel_y is [entry.pixel_y]") + + if(istype(entry, /obj/effect/decal/cleanable/crayon)) + var/obj/effect/decal/cleanable/crayon/Inst = entry + LAZYADDASSOC(., "art_type", "[Inst.art_type]") + to_world("art type is [Inst.art_type]") + LAZYADDASSOC(., "art_color", "[Inst.art_color]") + to_world("art color is [Inst.art_color]") + LAZYADDASSOC(., "art_shade", "[Inst.art_shade]") + to_world("art shade is [Inst.art_shade]") + // CHOMPAdd End diff --git a/code/modules/persistence/effects/graffiti.dm b/code/modules/persistence/effects/graffiti.dm index 0a17787a65..e9091b43dd 100644 --- a/code/modules/persistence/effects/graffiti.dm +++ b/code/modules/persistence/effects/graffiti.dm @@ -3,6 +3,13 @@ entries_expire_at = 4 // This previously was at 50 rounds??? Over 10 days. has_admin_data = TRUE +// CHOMPAdd Start +/datum/persistent/graffiti/CheckTokenSanity(var/list/token) + token["pixel_x"] = istext(token["pixel_x"]) ? text2num(token["pixel_x"]) : token["pixel_x"] + token["pixel_y"] = istext(token["pixel_y"]) ? text2num(token["pixel_y"]) : token["pixel_y"] + return ..() && isnum(token["pixel_x"]) && isnum(token["pixel_y"]) +// CHOMPAdd End + /datum/persistent/graffiti/GetValidTurf(var/turf/T, var/list/token) var/turf/checking_turf = ..() if(istype(checking_turf) && checking_turf.can_engrave()) @@ -20,6 +27,12 @@ var/obj/effect/decal/writing/inst = new /obj/effect/decal/writing(creating, token["age"]+1, token["message"], token["author"]) if(token["icon_state"]) inst.icon_state = token["icon_state"] + // CHOMPAdd Start + if(token["pixel_x"]) + inst.pixel_x = token["pixel_x"] + if(token["pixel_y"]) + inst.pixel_y = token["pixel_y"] + // CHOMPAdd End /datum/persistent/graffiti/IsValidEntry(var/atom/entry) . = ..() @@ -37,6 +50,8 @@ LAZYADDASSOC(., "author", "[save_graffiti.author ? save_graffiti.author : "unknown"]") LAZYADDASSOC(., "message", "[save_graffiti.message]") LAZYADDASSOC(., "icon_state", "[save_graffiti.icon_state]") + LAZYADDASSOC(., "pixel_x", "[save_graffiti.pixel_x]") // CHOMPAdd + LAZYADDASSOC(., "pixel_y", "[save_graffiti.pixel_y]") // CHOMPAdd /datum/persistent/graffiti/GetAdminDataStringFor(var/thing, var/can_modify, var/mob/user) var/obj/effect/decal/writing/save_graffiti = thing diff --git a/code/modules/persistence/effects/trash.dm b/code/modules/persistence/effects/trash.dm index 628c1d421f..975cfebc9a 100644 --- a/code/modules/persistence/effects/trash.dm +++ b/code/modules/persistence/effects/trash.dm @@ -1,6 +1,7 @@ /datum/persistent/filth/trash name = "trash" saves_dirt = FALSE //VOREStation edit + has_admin_data = FALSE // CHOMPEdit /datum/persistent/filth/trash/CheckTurfContents(var/turf/T, var/list/tokens) var/too_much_trash = 0 @@ -19,4 +20,4 @@ return trash.age /datum/persistent/filth/trash/GetEntryPath(var/atom/entry) - return entry.type \ No newline at end of file + return entry.type