The Paint & Linen Update [Splinter 5]: Painting Floors, Walls, Paint Rollers, High Rollers (#35534)
* Soft Reset * white define * alpha define * high roller starting mats, recyk, and melt temp * open container check * removed radium prank, moved to a special interaction with the painting brush * fixing conflicts in items.dmi (removed coin icons moved to coins.dmi)
@@ -8,4 +8,9 @@
|
||||
#define COLOR_WHITEMODE_TEXT "#000000"
|
||||
|
||||
#define DYNAMIC_TEXT_COLOR_V_MIN 60 //Dynamically-colored text such as that describing blood-stains will have its HSV V brightness clamped to between these.
|
||||
#define DYNAMIC_TEXT_COLOR_V_MAX 200
|
||||
#define DYNAMIC_TEXT_COLOR_V_MAX 200
|
||||
|
||||
#define COLOR_WHITE "#FFFFFF"
|
||||
#define COLOR_LINEN "#E5E4DC"
|
||||
#define COLOR_RADIUM "#61F09A"
|
||||
#define COLOR_GLUE "#FFFFCC"
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#define MINIGUN_SLOWDOWN_WIELDED 8
|
||||
|
||||
#define FIREAXE_SLOWDOWN 1.4
|
||||
#define HIGHROLLER_SLOWDOWN 1.4
|
||||
|
||||
#define COMMAND_POSITIONS list("Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer")
|
||||
#define ENGINEERING_POSITIONS list("Chief Engineer", "Station Engineer", "Atmospheric Technician", "Mechanic")
|
||||
|
||||
@@ -95,6 +95,8 @@ Why is FLOAT_PLANE added to a bunch of these?
|
||||
#define SIDE_LAYER 3
|
||||
|
||||
#define TURF_PLANE (-1 + FLOAT_PLANE)
|
||||
#define PAINT_LAYER (TURF_LAYER + 1)
|
||||
#define ADVANCED_GRAFFITI_LAYER (TURF_LAYER + 2)
|
||||
#define MAPPING_TURF_LAYER -999
|
||||
|
||||
#define GLASSTILE_PLANE -1 // Another one that won't behave, since it's an overlay
|
||||
@@ -134,8 +136,6 @@ Why is FLOAT_PLANE added to a bunch of these?
|
||||
#define BELOW_OBJ_LAYER 2
|
||||
#define MACHINERY_LAYER 2.5
|
||||
// OBJ_LAYER 3
|
||||
#define CANVAS_LAYER 3.1 // So that canvas always appear above easels
|
||||
#define EASEL_OVERLAY_LAYER 3.2 // So that the easel bits that hold a canvas in place always appear above a canvas
|
||||
#define ABOVE_OBJ_LAYER 4
|
||||
#define SIDE_WINDOW_LAYER 5
|
||||
#define FULL_WINDOW_LAYER 6
|
||||
@@ -168,8 +168,11 @@ Why is FLOAT_PLANE added to a bunch of these?
|
||||
#define VEHICLE_LAYER 0
|
||||
#define CHAIR_ARMREST_LAYER 0
|
||||
#define DISPOSALS_CHUTE_LAYER 0
|
||||
#define EASEL_LAYER 0
|
||||
#define RAILING_BACK_LAYER 0.1
|
||||
#define RAILING_MID_LAYER 0.2
|
||||
#define CANVAS_LAYER 1 // So that canvas always appear above easels
|
||||
#define EASEL_OVERLAY_LAYER 2 // So that the easel bits that hold a canvas in place always appear above a canvas
|
||||
#define RAILING_FRONT_LAYER 0.3
|
||||
#define WINDOOR_LAYER 1
|
||||
#define OPEN_CURTAIN_LAYER 2
|
||||
|
||||
@@ -1868,3 +1868,8 @@ var/list/weekend_days = list("Friday", "Saturday", "Sunday")
|
||||
//Cooking-related temperatures
|
||||
#define COOKTEMP_DEFAULT (T0C + 316) //Default cooking temperature, around 600 F
|
||||
#define COOKTEMP_HUMANSAFE (BODYTEMP_HEAT_DAMAGE_LIMIT - 1) //Human-safe temperature for cooked food, 1 degree less than the threshold for burning a human.
|
||||
|
||||
//Paint Luminosity
|
||||
#define PAINTLIGHT_NONE 0 //regular paint
|
||||
#define PAINTLIGHT_LIMITED 1 //radium, lights up on canvas, limited color mixing
|
||||
#define PAINTLIGHT_FULL 2 //nano paint, lights up floors as well
|
||||
|
||||
@@ -96,6 +96,7 @@
|
||||
var/max_elements
|
||||
var/pages = 1
|
||||
var/current_page = 1
|
||||
var/color = null
|
||||
|
||||
var/hudfix_method = TRUE //TRUE to change anchor to user, FALSE to shift by py_shift
|
||||
var/py_shift = 0
|
||||
@@ -341,6 +342,7 @@
|
||||
menu_holder.plane = ABOVE_HUD_PLANE
|
||||
menu_holder.appearance_flags |= KEEP_APART
|
||||
menu_holder.vis_contents += elements + close_button
|
||||
menu_holder.color = color
|
||||
current_user.images += menu_holder
|
||||
|
||||
/datum/radial_menu/proc/hide()
|
||||
@@ -418,7 +420,7 @@
|
||||
Choices should be a list where list keys are movables or text used for element names and return value
|
||||
and list values are movables/icons/images used for element icons
|
||||
*/
|
||||
/proc/show_radial_menu(mob/user,atom/anchor,list/choices,var/icon_file,var/tooltip_theme,var/callback/custom_check,var/uniqueid,var/radius,var/min_angle,var/starting_angle,var/ending_angle,var/recursive = FALSE, var/close_other_menus)
|
||||
/proc/show_radial_menu(mob/user,atom/anchor,list/choices,var/icon_file,var/tooltip_theme,var/callback/custom_check,var/uniqueid,var/radius,var/min_angle,var/starting_angle,var/ending_angle,var/recursive = FALSE, var/close_other_menus, var/custom_color = null)
|
||||
if(!user || !anchor || !length(choices))
|
||||
return
|
||||
|
||||
@@ -437,7 +439,7 @@
|
||||
|
||||
if(istype(custom_check))
|
||||
menu.custom_check = custom_check
|
||||
|
||||
menu.color = custom_color
|
||||
menu.recursion = recursive
|
||||
menu.check_screen_border(user) //Do what's needed to make it look good near borders or on hud
|
||||
menu.set_choices(choices)
|
||||
|
||||
@@ -386,6 +386,7 @@
|
||||
/obj/item/weapon/reagent_containers/glass/paint/white,
|
||||
/obj/item/weapon/reagent_containers/glass/paint/remover,
|
||||
/obj/item/weapon/painting_brush,
|
||||
/obj/item/paint_roller,
|
||||
/obj/item/mounted/frame/painting/custom,
|
||||
/obj/item/mounted/frame/painting/custom,
|
||||
/obj/item/mounted/frame/painting/custom/landscape,
|
||||
|
||||
@@ -4145,6 +4145,7 @@ var/global/list/obj/item/weapon/paper/lotto_numbers/lotto_papers = list()
|
||||
/obj/item/weapon/storage/fancy/crayons = 2,
|
||||
/obj/item/weapon/pen/multi = 3,
|
||||
/obj/item/weapon/painting_brush = 2,
|
||||
/obj/item/paint_roller = 2,
|
||||
/obj/item/weapon/palette = 2,
|
||||
/obj/structure/painting/custom = 3,
|
||||
/obj/structure/painting/custom/landscape = 3,
|
||||
@@ -4169,6 +4170,7 @@ var/global/list/obj/item/weapon/paper/lotto_numbers/lotto_papers = list()
|
||||
/obj/item/weapon/storage/fancy/crayons = 10,
|
||||
/obj/item/weapon/pen/multi = 20,
|
||||
/obj/item/weapon/painting_brush = 10,
|
||||
/obj/item/paint_roller = 20,
|
||||
/obj/item/weapon/palette = 10,
|
||||
/obj/structure/painting/custom = 10,
|
||||
/obj/structure/painting/custom/landscape = 10,
|
||||
|
||||
@@ -184,10 +184,19 @@
|
||||
if(truedir>15) // Check if we're in the GOING block
|
||||
state = state || going_state
|
||||
truedir=truedir>>4
|
||||
var/icon/add = icon('icons/effects/fluidtracks.dmi', state, truedir)
|
||||
add.SwapColor("#FFFFFF",track.basecolor)
|
||||
var/image/realadd = image(add,, state,, truedir)
|
||||
overlays += realadd
|
||||
if (isfloor(loc))
|
||||
var/turf/T = loc
|
||||
var/image/terrain = image(T.get_paint_icon(),src,T.get_paint_state(), dir = T.dir)
|
||||
terrain.color = track.basecolor
|
||||
terrain.blend_mode = BLEND_INSET_OVERLAY
|
||||
var/image/tracks = image('icons/effects/fluidtracks.dmi',src, state, dir = truedir)
|
||||
tracks.appearance_flags = KEEP_TOGETHER
|
||||
tracks.overlays += terrain
|
||||
overlays += tracks
|
||||
else
|
||||
var/image/add = image('icons/effects/fluidtracks.dmi',src, state, dir = truedir)
|
||||
add.color = track.basecolor
|
||||
overlays += add
|
||||
if(track.basecolor == "#FF0000"||track.basecolor == DEFAULT_BLOOD) // no dirty dumb vox scum allowed
|
||||
plane = NOIR_BLOOD_PLANE
|
||||
else
|
||||
|
||||
@@ -254,6 +254,9 @@
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/item/stack/proc/transfer_data_from(var/obj/item/stack/S, var/amount)
|
||||
return
|
||||
|
||||
/obj/item/stack/preattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
if (!proximity_flag)
|
||||
return 0
|
||||
|
||||
@@ -46,7 +46,6 @@ var/global/list/lightfloor_colors = list(
|
||||
|
||||
/obj/item/stack/tile/light/update_icon(var/new_color)
|
||||
.=..()
|
||||
overlays = list()
|
||||
color_overlay = image('icons/obj/items.dmi', icon_state = "light_tile_overlay")
|
||||
color_overlay.color = rgb(color_r,color_g,color_b)
|
||||
overlays += color_overlay
|
||||
|
||||
@@ -5,36 +5,6 @@
|
||||
* Carpet
|
||||
*/
|
||||
|
||||
/obj/item/stack/tile
|
||||
var/material
|
||||
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/sheets_n_ores.dmi', "right_hand" = 'icons/mob/in-hand/right/sheets_n_ores.dmi')
|
||||
|
||||
/obj/item/stack/tile/proc/adjust_slowdown(mob/living/L, current_slowdown)
|
||||
return current_slowdown
|
||||
|
||||
/obj/item/stack/tile/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
/obj/item/stack/tile/blob_act()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/stack/tile/singularity_act()
|
||||
qdel(src)
|
||||
return 2
|
||||
|
||||
/*
|
||||
* Grass
|
||||
*/
|
||||
|
||||
@@ -1,3 +1,66 @@
|
||||
|
||||
/obj/item/stack/tile
|
||||
icon = 'icons/obj/tiles.dmi'
|
||||
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/sheets_n_ores.dmi', "right_hand" = 'icons/mob/in-hand/right/sheets_n_ores.dmi')
|
||||
var/material
|
||||
var/datum/paint_overlay/paint_overlay = null
|
||||
var/list/stacked_paint = list()
|
||||
|
||||
/obj/item/stack/tile/transfer_data_from(var/obj/item/stack/tile/S, var/amount)
|
||||
while(amount > 0)
|
||||
if (!S.paint_overlay)
|
||||
return
|
||||
if (!paint_overlay)
|
||||
paint_overlay = S.paint_overlay
|
||||
S.paint_overlay = null
|
||||
if (S.stacked_paint.len > 0)
|
||||
var/datum/paint_overlay/paint = S.stacked_paint[1]
|
||||
S.stacked_paint -= paint
|
||||
S.paint_overlay = paint
|
||||
else
|
||||
stacked_paint += S.paint_overlay
|
||||
S.paint_overlay = null
|
||||
if (S.stacked_paint.len > 0)
|
||||
var/datum/paint_overlay/paint = S.stacked_paint[1]
|
||||
S.stacked_paint -= paint
|
||||
S.paint_overlay = paint
|
||||
amount--
|
||||
|
||||
/obj/item/stack/tile/update_icon()
|
||||
overlays.len = 0
|
||||
if (paint_overlay && paint_overlay.sub_overlays.len > 0)
|
||||
var/image/O = pick(paint_overlay.sub_overlays)
|
||||
var/image/I = image('icons/obj/tiles.dmi',src,"tile-paint")
|
||||
I.color = O.color
|
||||
overlays += I
|
||||
|
||||
/obj/item/stack/tile/proc/adjust_slowdown(mob/living/L, current_slowdown)
|
||||
return current_slowdown
|
||||
|
||||
/obj/item/stack/tile/ex_act(severity)
|
||||
switch(severity)
|
||||
if(1.0)
|
||||
qdel(src)
|
||||
return
|
||||
if(2.0)
|
||||
if (prob(50))
|
||||
qdel(src)
|
||||
return
|
||||
if(3.0)
|
||||
if (prob(5))
|
||||
qdel(src)
|
||||
return
|
||||
else
|
||||
return
|
||||
|
||||
/obj/item/stack/tile/blob_act()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/stack/tile/singularity_act()
|
||||
qdel(src)
|
||||
return 2
|
||||
|
||||
|
||||
/obj/item/stack/tile/metal
|
||||
name = "floor tile"
|
||||
singular_name = "floor tile"
|
||||
|
||||
@@ -216,6 +216,8 @@
|
||||
var/turf/Tsrc = get_turf(src)
|
||||
if(!istype(Tsrc))
|
||||
return 0
|
||||
for (var/obj/effect/decal/cleanable/blood/tracks/footprints in Tsrc)
|
||||
qdel(footprints)//so footprints don't suddenly move on top of the new wall
|
||||
var/turf/simulated/wall/X = Tsrc.ChangeTurf(/turf/simulated/wall)
|
||||
if(X)
|
||||
X.add_hiddenprint(user)
|
||||
@@ -256,6 +258,8 @@
|
||||
user.visible_message("<span class='warning'>[user] finishes installing reinforced plating to \the [src].</span>", \
|
||||
"<span class='notice'>You finish installing reinforced plating to \the [src].</span>")
|
||||
var/turf/Tsrc = get_turf(src)
|
||||
for (var/obj/effect/decal/cleanable/blood/tracks/footprints in Tsrc)
|
||||
qdel(footprints)//so footprints don't suddenly move on top of the new wall
|
||||
var/turf/simulated/wall/r_wall/X = Tsrc.ChangeTurf(/turf/simulated/wall/r_wall)
|
||||
if(X)
|
||||
X.add_hiddenprint(user)
|
||||
@@ -323,6 +327,8 @@
|
||||
user.visible_message("<span class='notice'>[user] finishes reinforcing \the [src] with the [S.name].</span>", \
|
||||
"<span class='notice'>You finish reinforcing \the [src] with the [S.name].</span>")
|
||||
var/turf/Tsrc = get_turf(src)
|
||||
for (var/obj/effect/decal/cleanable/blood/tracks/footprints in Tsrc)
|
||||
qdel(footprints)//so footprints don't suddenly move on top of the new wall
|
||||
var/turf/simulated/wall/mineral/X = Tsrc.ChangeTurf(wallpath)
|
||||
if(X)
|
||||
X.add_hiddenprint(user)
|
||||
|
||||
@@ -92,6 +92,7 @@
|
||||
*/
|
||||
/turf/simulated/wall/relativewall()
|
||||
icon_state = "[walltype][..()]" // WHY ISN'T THIS IN UPDATE_ICON OR SIMILAR
|
||||
update_paint_overlay()
|
||||
|
||||
// AND NOW WE HAVE TO YELL AT THE NEIGHBORS FOR BEING LOUD AND NOT PAINTING WITH HOA-APPROVED COLORS
|
||||
/atom/proc/relativewall_neighbours(var/at=null)
|
||||
@@ -161,3 +162,4 @@ var/list/smoothable_unsims = list(
|
||||
/turf/unsimulated/wall/relativewall()
|
||||
if(icon_state in smoothable_unsims)
|
||||
icon_state = "[walltype][..()]"
|
||||
update_paint_overlay()
|
||||
|
||||
331
code/game/turfs/paint_overlay.dm
Normal file
@@ -0,0 +1,331 @@
|
||||
|
||||
/*
|
||||
|
||||
/turf/proc/get_paint_state()
|
||||
/turf/proc/get_paint_icon()
|
||||
/turf/proc/apply_paint_overlay()
|
||||
/turf/proc/apply_paint_stroke()
|
||||
/turf/proc/remove_paint_overlay()
|
||||
/turf/proc/update_paint_overlay()
|
||||
|
||||
/datum/paint_overlay
|
||||
|
||||
/obj/abstract/map/paint_coat
|
||||
/obj/abstract/map/paint_coat/paint_stroke
|
||||
|
||||
*/
|
||||
|
||||
//returns the icon_state that corresponds to the paint overlay for that given turf.
|
||||
/turf/proc/get_paint_state()
|
||||
var/paint_icon_state = icon_state
|
||||
switch (icon)
|
||||
if ('icons/turf/nfloors.dmi')
|
||||
paint_icon_state = "floor"
|
||||
if ('icons/turf/snow.dmi')
|
||||
if (icon_state == "plating")
|
||||
paint_icon_state = "plating-snow"
|
||||
else
|
||||
if (paint_icon_state in paint_overlay_override_floors)
|
||||
paint_icon_state = paint_overlay_override_floors[paint_icon_state]
|
||||
return paint_icon_state
|
||||
|
||||
/turf/simulated/floor/shuttle/get_paint_state()
|
||||
if (icon_state == "floor3")
|
||||
return "floor-shuttle1"
|
||||
return "floor-shuttle2"
|
||||
|
||||
/turf/simulated/floor/glass/get_paint_state()
|
||||
return "floor"
|
||||
|
||||
/turf/simulated/wall/get_paint_state()
|
||||
var/paint_icon_state = icon_state
|
||||
if (paint_icon_state in paint_overlay_override_walls)
|
||||
paint_icon_state = paint_overlay_override_walls[paint_icon_state]
|
||||
return paint_icon_state
|
||||
|
||||
/turf/simulated/wall/mineral/gold/get_paint_state()
|
||||
return replacetext(icon_state,mineral,"silver")
|
||||
|
||||
/turf/simulated/wall/mineral/silver/silver_old/get_paint_state()
|
||||
return replacetext(icon_state,mineral,"diamond")
|
||||
|
||||
/turf/simulated/wall/mineral/gold/gold_old/get_paint_state()
|
||||
return replacetext(icon_state,mineral,"diamond")
|
||||
|
||||
/turf/simulated/wall/mineral/iron/get_paint_state()
|
||||
return replacetext(icon_state,mineral,"diamond")
|
||||
|
||||
/turf/simulated/wall/mineral/sandstone/get_paint_state()
|
||||
return replacetext(icon_state,mineral,"diamond")
|
||||
|
||||
/turf/simulated/wall/mineral/clown/get_paint_state()
|
||||
return replacetext(icon_state,mineral,"diamond")
|
||||
|
||||
/turf/simulated/wall/mineral/clockwork/get_paint_state()
|
||||
return "clock"
|
||||
|
||||
/turf/unsimulated/wall/get_paint_state()
|
||||
var/paint_icon_state = icon_state
|
||||
if (paint_icon_state in paint_overlay_override_walls)
|
||||
paint_icon_state = paint_overlay_override_walls[paint_icon_state]
|
||||
return paint_icon_state
|
||||
|
||||
/turf/simulated/wall/shuttle/get_paint_state()
|
||||
var/paint_icon_state = icon_state
|
||||
if (findtext(icon_state,"bswall"))
|
||||
return copytext(icon_state,2)
|
||||
else if (paint_icon_state in paint_overlay_override_shuttle_walls)
|
||||
paint_icon_state = paint_overlay_override_shuttle_walls[paint_icon_state]
|
||||
return paint_icon_state
|
||||
|
||||
|
||||
//------------------------------------------------------
|
||||
|
||||
//returns the dmi that corresponds to the paint overlay for that given turf.
|
||||
/turf/proc/get_paint_icon()
|
||||
return 'icons/turf/paint_overlays_floors.dmi'
|
||||
|
||||
/turf/simulated/wall/get_paint_icon()
|
||||
return 'icons/turf/paint_overlays_walls.dmi'
|
||||
|
||||
/turf/unsimulated/wall/get_paint_icon()
|
||||
return 'icons/turf/paint_overlays_walls.dmi'
|
||||
|
||||
//------------------------------------------------------
|
||||
|
||||
//covers the whole turf with a new coat of paint, removing all paint decals in the process.
|
||||
/turf/proc/apply_paint_overlay(var/_color=COLOR_WHITE,var/_alpha=255,var/_DNA = list(),var/_nano_paint=FALSE)
|
||||
if (!paint_overlay)
|
||||
paint_overlay=new(src)
|
||||
paint_overlay.apply(_color,_alpha, null, SOUTH, _DNA, _nano_paint)
|
||||
|
||||
//applies a paint decal
|
||||
/turf/proc/apply_paint_stroke(var/_color=COLOR_WHITE,var/_alpha=255,var/_dir=SOUTH,var/_stroke_icon = "border_splatter",var/_DNA = list(),var/_nano_paint=FALSE)
|
||||
if (!paint_overlay)
|
||||
paint_overlay=new(src)
|
||||
paint_overlay.add_border_stroke(_color,_alpha,_dir, _stroke_icon, _DNA, _nano_paint)
|
||||
|
||||
//removes the paint overlay. Keeping erase at 0 let's us re-add it later, useful when we want to preserves things paint on plating hidden by floor tiles.
|
||||
/turf/proc/remove_paint_overlay(var/erase)
|
||||
if (paint_overlay)
|
||||
paint_overlay.remove(erase)
|
||||
|
||||
//refreshes the paint overlay, ensuring that it matches any changes to the turf (such as its icon changing from damage).
|
||||
/turf/proc/update_paint_overlay()
|
||||
if (paint_overlay)
|
||||
paint_overlay.update()
|
||||
lighting_overlay.update_overlay()
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/paint_overlay
|
||||
var/turf/my_turf
|
||||
var/image/overlay
|
||||
var/list/sub_overlays = list()
|
||||
var/wet_color = COLOR_WHITE
|
||||
var/wet_time = 0//world.time of the last time paint was applied that covers the whole tile AND is opaque enough (200+ alpha)
|
||||
var/wet_duration = 10 SECONDS//relatively fast-drying
|
||||
var/wet_amount = 3//how many steps with wet shoes
|
||||
var/list/blood_DNA = list()
|
||||
|
||||
var/arbitrary_overlay_limit = 32//figured not having a limit might be silly.
|
||||
|
||||
var/nano_paint = FALSE//if true, main_color is added to the turf's light, enabling turfs to be lit up even without a proper light source (Might have to rework that when Europa Lights come back)
|
||||
var/main_color = "#000000"
|
||||
|
||||
/datum/paint_overlay/New(var/turf/_turf)
|
||||
..()
|
||||
my_turf = _turf
|
||||
|
||||
//We'll need to make copies of a paint overlay when moving them to crowbar'd floor tiles.
|
||||
/datum/paint_overlay/proc/Copy()
|
||||
var/datum/paint_overlay/copy = new()
|
||||
copy.overlay = image('icons/turf/paint_overlays_floors.dmi',my_turf,"no_paint")
|
||||
for (var/image/lay in sub_overlays)
|
||||
var/image/I = image(lay)
|
||||
copy.sub_overlays += I
|
||||
copy.wet_color = wet_color
|
||||
copy.wet_time = wet_time
|
||||
copy.wet_duration = wet_duration
|
||||
copy.wet_amount = wet_amount
|
||||
copy.blood_DNA = blood_DNA.Copy()
|
||||
|
||||
copy.nano_paint = nano_paint
|
||||
copy.main_color = main_color
|
||||
return copy
|
||||
|
||||
#define PAINT_OPACITY_THRESHOLD_FOR_FOOTPRINTS_REMOVAL 200
|
||||
|
||||
//the main proc that deals with actually adding paint on the floor
|
||||
/datum/paint_overlay/proc/apply(var/_color=COLOR_WHITE,var/_alpha=255,var/_mask=null,var/_mask_dir=SOUTH,var/list/_blood_DNA=list(),var/_nano_paint=FALSE)
|
||||
my_turf.overlays -= overlay
|
||||
if (!overlay)
|
||||
overlay = image('icons/turf/paint_overlays_floors.dmi',my_turf,"no_paint")
|
||||
overlay.layer = PAINT_LAYER
|
||||
if (sub_overlays.len >= arbitrary_overlay_limit)
|
||||
_mask = null
|
||||
_alpha = 255
|
||||
if (!_mask && _alpha == 255)
|
||||
overlay.overlays.len = 0//we're applying a full opaque coat of paint so let's get rid of the other overlays
|
||||
sub_overlays.len = 0
|
||||
blood_DNA = list()
|
||||
if (!_mask)
|
||||
if (_nano_paint || (nano_paint && !_nano_paint))
|
||||
main_color = _color
|
||||
nano_paint = _nano_paint
|
||||
my_turf.lighting_overlay.update_overlay()
|
||||
var/image/new_paint_layer = image(my_turf.get_paint_icon(),my_turf,my_turf.get_paint_state(), dir = my_turf.dir)
|
||||
new_paint_layer.color = _color
|
||||
new_paint_layer.alpha = _alpha
|
||||
overlay.overlays += new_paint_layer
|
||||
sub_overlays += new_paint_layer
|
||||
if (_alpha >= PAINT_OPACITY_THRESHOLD_FOR_FOOTPRINTS_REMOVAL)
|
||||
wet(_color, 10 SECONDS, 3)
|
||||
for(var/obj/effect/decal/cleanable/blood/tracks/T in my_turf)
|
||||
qdel(T)//and let's remove footprints too
|
||||
else
|
||||
var/image/terrain = image(my_turf.get_paint_icon(),my_turf,my_turf.get_paint_state(), dir = my_turf.dir)
|
||||
terrain.blend_mode = BLEND_INSET_OVERLAY
|
||||
var/image/mask = image('icons/turf/paint_masks.dmi',my_turf, _mask, dir = _mask_dir)
|
||||
mask.appearance_flags = KEEP_TOGETHER
|
||||
mask.alpha = _alpha
|
||||
mask.color = _color
|
||||
mask.overlays += terrain
|
||||
overlay.overlays += mask
|
||||
sub_overlays += mask
|
||||
blood_DNA |= _blood_DNA
|
||||
if (blood_DNA.len <= 0)
|
||||
blood_DNA["wet paint"] = "paint"
|
||||
my_turf.overlays += overlay
|
||||
|
||||
#undef PAINT_OPACITY_THRESHOLD_FOR_FOOTPRINTS_REMOVAL
|
||||
|
||||
//Causes the floor to wet the feet of humans, causing them to leave paint footprints
|
||||
/datum/paint_overlay/proc/wet(var/_color=COLOR_WHITE,var/_duration=10 SECONDS, var/_amount=3)//amount means how far footprints can go
|
||||
wet_time = world.time
|
||||
|
||||
wet_color = _color
|
||||
wet_duration = _duration
|
||||
wet_amount = _amount
|
||||
|
||||
//Adding paint decals.
|
||||
/datum/paint_overlay/proc/add_border_stroke(var/_color=COLOR_WHITE,var/_alpha=255,var/_dir=SOUTH,var/stroke_icon = "border_splatter",var/list/_blood_DNA=list(),var/_nano_paint=FALSE)
|
||||
if (!overlay)
|
||||
overlay = image('icons/turf/paint_overlays_floors.dmi',my_turf,"no_paint")
|
||||
overlay.layer = PAINT_LAYER
|
||||
if (stroke_icon == "border_roller")//progressively painting over the whole tile
|
||||
if (sub_overlays.len > 0)
|
||||
var/image/lay = sub_overlays[sub_overlays.len]//grabbing the most recent overlay
|
||||
if (lay.icon == 'icons/turf/paint_masks.dmi')
|
||||
if ((lay.color ? lay.color : "#ffffff") == copytext(_color,1,8) && lay.alpha == round(_alpha))//same paint
|
||||
if (lay.dir == _dir)
|
||||
switch(lay.icon_state)
|
||||
if ("border_roller")
|
||||
apply(_color,_alpha,"border_roller_progress",_dir,_blood_DNA,_nano_paint)
|
||||
return
|
||||
if ("border_roller_progress")
|
||||
apply(_color,_alpha,null,_dir,_blood_DNA,_nano_paint)//On the third click we just apply a coat over the whole tile
|
||||
return
|
||||
if (stroke_icon == "wall_side")//painting around a wall
|
||||
if (sub_overlays.len > 0)
|
||||
var/image/lay = sub_overlays[sub_overlays.len]//grabbing the most recent overlay
|
||||
if (lay.icon == 'icons/turf/paint_masks.dmi')
|
||||
if ((lay.color ? lay.color : "#ffffff") == copytext(_color,1,8) && lay.alpha == round(_alpha))//painting the same side twice in a row with the same paint covers the whole wall
|
||||
if (lay.dir == _dir)
|
||||
apply(_color,_alpha,null,_dir,_blood_DNA,_nano_paint)
|
||||
return
|
||||
apply(_color,_alpha,stroke_icon,_dir,_blood_DNA,_nano_paint)
|
||||
|
||||
/datum/paint_overlay/proc/update()//updates the paint layers when floors get damaged and such
|
||||
if (!overlay)
|
||||
return
|
||||
my_turf.overlays -= overlay
|
||||
overlay.overlays.len = 0
|
||||
var/turf_icon = my_turf.get_paint_icon()
|
||||
var/turf_state = my_turf.get_paint_state()
|
||||
for (var/image/lay in sub_overlays)
|
||||
if (lay.icon == 'icons/turf/paint_masks.dmi')
|
||||
lay.overlays.len = 0
|
||||
var/image/I = image(turf_icon,my_turf,turf_state, dir = my_turf.dir)
|
||||
I.blend_mode = BLEND_INSET_OVERLAY
|
||||
lay.overlays += I
|
||||
else
|
||||
lay.icon = turf_icon
|
||||
lay.icon_state = turf_state
|
||||
overlay.overlays += lay
|
||||
my_turf.overlays += overlay
|
||||
|
||||
/datum/paint_overlay/proc/remove(var/erase=0)
|
||||
my_turf.overlays -= overlay
|
||||
if (nano_paint)
|
||||
nano_paint = FALSE
|
||||
my_turf.lighting_overlay.update_overlay()
|
||||
if (erase)
|
||||
overlay.overlays.len = 0
|
||||
sub_overlays.len = 0
|
||||
wet_time = 0
|
||||
blood_DNA = list()
|
||||
|
||||
/datum/paint_overlay/proc/add_paint_to_feet(var/mob/living/carbon/human/H)
|
||||
if (!overlay || !wet_time || ((world.time - wet_time) > wet_duration))
|
||||
return
|
||||
if(H.shoes)
|
||||
var/obj/item/clothing/shoes/S = H.shoes
|
||||
S.track_blood = max(0, wet_amount, S.track_blood)
|
||||
|
||||
if(!blood_overlays["[S.type][S.icon_state]"])
|
||||
S.set_blood_overlay()
|
||||
|
||||
if(S.blood_overlay != null)
|
||||
S.overlays.Remove(S.blood_overlay)
|
||||
else
|
||||
S.blood_overlay = blood_overlays["[S.type][S.icon_state]"]
|
||||
|
||||
if(!S.blood_DNA)
|
||||
S.blood_DNA = list()
|
||||
S.blood_DNA |= blood_DNA.Copy()
|
||||
|
||||
var/newcolor = (S.blood_color && S.blood_DNA.len) ? BlendRYB(S.blood_color, wet_color, 0.5) : wet_color
|
||||
S.blood_overlay.color = newcolor
|
||||
S.overlays += S.blood_overlay
|
||||
S.blood_color = newcolor
|
||||
|
||||
H.update_inv_shoes(1)
|
||||
|
||||
else
|
||||
H.track_blood = max(wet_amount, 0, H.track_blood)
|
||||
if(!H.feet_blood_DNA)
|
||||
H.feet_blood_DNA = list()
|
||||
H.feet_blood_DNA |= blood_DNA.Copy()
|
||||
H.feet_blood_color = (H.feet_blood_color && H.feet_blood_DNA.len) ? BlendRYB(H.feet_blood_color, wet_color, 0.5) : wet_color
|
||||
|
||||
H.update_inv_shoes(1)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//Lets mappers have some turfs pre-painted
|
||||
|
||||
/obj/abstract/map/paint_coat
|
||||
plane = TURF_PLANE
|
||||
layer = PAINT_LAYER
|
||||
icon = 'icons/turf/paint_overlays_floors.dmi'
|
||||
icon_state = "fullblack"
|
||||
color = COLOR_WHITE
|
||||
alpha = 255
|
||||
var/coat_luminosity = FALSE
|
||||
|
||||
/obj/abstract/map/paint_coat/perform_spawn()
|
||||
var/turf/T = get_turf(loc)
|
||||
if (T)
|
||||
T.apply_paint_overlay(color,alpha,list(),coat_luminosity)
|
||||
qdel(src)
|
||||
|
||||
/obj/abstract/map/paint_coat/paint_stroke
|
||||
icon = 'icons/turf/paint_masks.dmi'
|
||||
icon_state = "border_roller"
|
||||
dir = SOUTH
|
||||
|
||||
/obj/abstract/map/paint_coat/paint_stroke/perform_spawn()
|
||||
var/turf/T = get_turf(loc)
|
||||
if (T)
|
||||
T.apply_paint_stroke(color,alpha,dir,icon_state,list(),coat_luminosity)
|
||||
qdel(src)
|
||||
237
code/game/turfs/paint_overlay_overrides.dm
Normal file
@@ -0,0 +1,237 @@
|
||||
|
||||
//These lists remove the need for having identical dmi states.
|
||||
var/list/paint_overlay_override_floors = list(
|
||||
"white" = "floor",
|
||||
"dark" = "floor",
|
||||
"bar" = "floor",
|
||||
"stage_left" = "floor",
|
||||
"stage_bleft" = "floor",
|
||||
"cafeteria" = "floor",
|
||||
"red" = "floor",
|
||||
"redcorner" = "floor",
|
||||
"redfull" = "floor",
|
||||
"whitered" = "floor",
|
||||
"whiteredcorner" = "floor",
|
||||
"whiteredfull" = "floor",
|
||||
"blue" = "floor",
|
||||
"bluecorner" = "floor",
|
||||
"bluefull" = "floor",
|
||||
"whiteblue" = "floor",
|
||||
"whitebluecorner" = "floor",
|
||||
"whitebluefull" = "floor",
|
||||
"green" = "floor",
|
||||
"greencorner" = "floor",
|
||||
"greenfull" = "floor",
|
||||
"whitegreen" = "floor",
|
||||
"whitegreencorner" = "floor",
|
||||
"whitegreenfull" = "floor",
|
||||
"yellow" = "floor",
|
||||
"yellowcorner" = "floor",
|
||||
"yellowfull" = "floor",
|
||||
"whiteyellow" = "floor",
|
||||
"whiteyellowcorner" = "floor",
|
||||
"whiteyellowfull" = "floor",
|
||||
"chapeldark" = "chapel",
|
||||
"enginewarncorner" = "engine",
|
||||
"engineloadingarea" = "engine",
|
||||
"enginedelivery" = "engine",
|
||||
"enginebot" = "engine",
|
||||
"enginewarn" = "engine",
|
||||
"bcircuitoff" = "bcircuit",
|
||||
"gcircuit" = "bcircuit",
|
||||
"gcircuitoff" = "bcircuit",
|
||||
"neutral" = "floor",
|
||||
"neutralfull" = "floor",
|
||||
"neutralcorner" = "floor",
|
||||
"orange" = "floor",
|
||||
"orangecorner" = "floor",
|
||||
"orangefull" = "floor",
|
||||
"whitehall" = "floor",
|
||||
"whitecorner" = "floor",
|
||||
"arrival" = "floor",
|
||||
"arrivalcorner" = "floor",
|
||||
"escape" = "floor",
|
||||
"escapecorner" = "floor",
|
||||
"purple" = "floor",
|
||||
"purplecorner" = "floor",
|
||||
"purplefull" = "floor",
|
||||
"whitepurple" = "floor",
|
||||
"whitepurplecorner" = "floor",
|
||||
"whitepurplefull" = "floor",
|
||||
"cmo" = "floor",
|
||||
"black" = "floor",
|
||||
"blackcorner" = "floor",
|
||||
"caution" = "floor",
|
||||
"cautioncorner" = "floor",
|
||||
"floorgrime" = "floor",
|
||||
"freezerfloor" = "floor",
|
||||
"panelscorched" = "plating",
|
||||
"floorscorched1" = "floor",
|
||||
"floorscorched2" = "floor",
|
||||
"delivery" = "floor",
|
||||
"bot" = "floor",
|
||||
"hydrofloor" = "floor",
|
||||
"brownold" = "floor",
|
||||
"browncornerold" = "floor",
|
||||
"brown" = "floor",
|
||||
"browncorner" = "floor",
|
||||
"redyellow" = "floor",
|
||||
"redyellowfull" = "floor",
|
||||
"redblue" = "floor",
|
||||
"bluered" = "floor",
|
||||
"redbluefull" = "floor",
|
||||
"redgreen" = "floor",
|
||||
"redgreenfull" = "floor",
|
||||
"greenyellow" = "floor",
|
||||
"greenyellowfull" = "floor",
|
||||
"greenblue" = "floor",
|
||||
"greenbluefull" = "floor",
|
||||
"blueyellow" = "floor",
|
||||
"blueyellowfull" = "floor",
|
||||
"showroomfloor" = "floor",
|
||||
"warnwhite" = "warning",
|
||||
"warnwhitecorner" = "warningcorner",
|
||||
"dark-markings" = "floor",
|
||||
"dark vault corner" = "floor",
|
||||
"dark vault full" = "floor",
|
||||
"dark vault stripe" = "floor",
|
||||
"loadingareadirty1" = "loadingarea",
|
||||
"loadingareadirty2" = "loadingarea",
|
||||
"light_on_flicker1" = "no_paint",
|
||||
"light_on_flicker2" = "no_paint",
|
||||
"light_on_flicker3" = "no_paint",
|
||||
"light_on_flicker4" = "no_paint",
|
||||
"light_on" = "no_paint",
|
||||
"light_off" = "no_paint",
|
||||
"light_broken" = "no_paint",
|
||||
"light_on-r" = "no_paint",
|
||||
"light_on-g" = "no_paint",
|
||||
"light_on-b" = "no_paint",
|
||||
"light_on-y" = "no_paint",
|
||||
"light_on-p" = "no_paint",
|
||||
"light_on-w" = "no_paint",
|
||||
"light_base" = "no_paint",
|
||||
"sandstonevault" = "rockvault",
|
||||
"alienvault" = "rockvault",
|
||||
"barber" = "floor",
|
||||
"whitebot" = "floor",
|
||||
"whitedelivery" = "floor",
|
||||
"lava" = "no_paint",
|
||||
"floor4" = "floor-shuttle2",
|
||||
"bcarpet01" = "carpet6-2",
|
||||
"bcarpet02" = "carpet14-10",
|
||||
"bcarpet03" = "carpet10-8",
|
||||
"bcarpet04" = "carpet7-3",
|
||||
"bcarpet05" = "carpet15-15",
|
||||
"bcarpet06" = "carpet11-12",
|
||||
"bcarpet07" = "carpet5-1",
|
||||
"bcarpet08" = "carpet13-5",
|
||||
"bcarpet09" = "carpet9-4",
|
||||
"old_enginewarncorner" = "old_engine",
|
||||
"old_engineloadingarea" = "old_engine",
|
||||
"old_enginedelivery" = "old_engine",
|
||||
"old_enginebot" = "old_engine",
|
||||
"old_enginewarn" = "old_engine",
|
||||
"checker" = "floor",
|
||||
"vaultfull" = "floor",
|
||||
"dark blue corner" = "floor",
|
||||
"dark blue full" = "floor",
|
||||
"dark blue stripe" = "floor",
|
||||
"dark brown corner" = "floor",
|
||||
"dark brown full" = "floor",
|
||||
"dark brown stripe" = "floor",
|
||||
"dark floor corner" = "floor",
|
||||
"dark floor full" = "floor",
|
||||
"dark floor stripe" = "floor",
|
||||
"dark green corner" = "floor",
|
||||
"dark green full" = "floor",
|
||||
"dark green stripe" = "floor",
|
||||
"dark neutral corner" = "floor",
|
||||
"dark neutral full" = "floor",
|
||||
"dark neutral stripe" = "floor",
|
||||
"dark orange corner" = "floor",
|
||||
"dark orange full" = "floor",
|
||||
"dark orange stripe" = "floor",
|
||||
"dark purple corner" = "floor",
|
||||
"dark purple full" = "floor",
|
||||
"dark purple stripe" = "floor",
|
||||
"dark red corner" = "floor",
|
||||
"dark red full" = "floor",
|
||||
"dark red stripe" = "floor",
|
||||
"dark yellow corner" = "floor",
|
||||
"dark yellow full" = "floor",
|
||||
"dark yellow stripe" = "floor",
|
||||
"darkpurple" = "floor",
|
||||
"darkpurplecorners" = "floor",
|
||||
"darkpurplefull" = "floor",
|
||||
"darkred" = "floor",
|
||||
"darkredcorners" = "floor",
|
||||
"darkredfull" = "floor",
|
||||
"darkblue" = "floor",
|
||||
"darkbluecorners" = "floor",
|
||||
"darkbluefull" = "floor",
|
||||
"darkgreen" = "floor",
|
||||
"darkgreencorners" = "floor",
|
||||
"darkgreenfull" = "floor",
|
||||
"darkyellow" = "floor",
|
||||
"darkyellowcorners" = "floor",
|
||||
"darkyellowfull" = "floor",
|
||||
"darkbrown" = "floor",
|
||||
"darkbrowncorners" = "floor",
|
||||
"darkbrownfull" = "floor",
|
||||
"vault" = "floor",
|
||||
"yellow_tint" = "floor",
|
||||
"pattern_blue" = "pattern_yellow",
|
||||
"pattern_red" = "pattern_yellow",
|
||||
"dark_navy" = "floor",
|
||||
"dark_navy_corner" = "floor",
|
||||
"dark_navy_full" = "floor",
|
||||
"tatami-yellow-spiral" = "tatami-green-spiral",
|
||||
"tatami-yellow-3mat" = "tatami-green-3mat",
|
||||
"tatami-yellow-1mat-hori" = "tatami-green-1mat-hori",
|
||||
"tatami-yellow-1mat-verti" = "tatami-green-1mat-verti",
|
||||
"tatami-yellow-2mat-hori" = "tatami-green-2mat-hori",
|
||||
"tatami-yellow-2mat-verti" = "tatami-green-2mat-verti",
|
||||
"tatami-yellow-halfmat" = "tatami-green-halfmat",
|
||||
"gold" = "silver",
|
||||
"gold_broken" = "silver_broken",
|
||||
)
|
||||
|
||||
var/list/paint_overlay_override_shuttle_walls = list(
|
||||
"wall2" = "wall1",
|
||||
"diagonalWall2" = "diagonalWall",
|
||||
"diagonalWall3" = "diagonalWall",
|
||||
"pwall" = "wall",
|
||||
"wall3" = "wall",
|
||||
"diagonalWall3S" = "diagonalWallS",
|
||||
)
|
||||
|
||||
var/list/paint_overlay_override_walls = list(
|
||||
"supermatter" = "no_paint",
|
||||
"rock(high)" = "rock",
|
||||
"rock(clown)" = "rock",
|
||||
"rock_Uranium" = "rock",
|
||||
"rock_Iron" = "rock",
|
||||
"rock_Gold" = "rock",
|
||||
"rock_Diamond" = "rock",
|
||||
"rock_Silver" = "rock",
|
||||
"rock_Plasma" = "rock",
|
||||
"rock_Clown" = "rock",
|
||||
"rock_Gibtonite" = "rock",
|
||||
"rock_Phazon" = "rock",
|
||||
"rock_Telecrystal" = "rock",
|
||||
"sandstonevault" = "rockvault",
|
||||
"alienvault" = "rockvault",
|
||||
"fakewindows" = "no_paint",
|
||||
"fakewindows2" = "no_paint",
|
||||
"mariahive_Uranium" = "mariahive",
|
||||
"mariahive_Iron" = "mariahive",
|
||||
"mariahive_Gold" = "mariahive",
|
||||
"mariahive_Diamond" = "mariahive",
|
||||
"mariahive_Silver" = "mariahive",
|
||||
"mariahive_Plasma" = "mariahive",
|
||||
"mariahive_Clown" = "mariahive",
|
||||
"mariahive_Phazon" = "mariahive",
|
||||
"mariahive_Telecrystal" = "mariahive",
|
||||
)
|
||||
|
||||
@@ -10,13 +10,14 @@
|
||||
var/can_exist_under_lattice = 0 //If 1, RemoveLattice() is not called when a turf is changed to this.
|
||||
|
||||
var/datum/custom_painting/advanced_graffiti
|
||||
var/icon/advanced_graffiti_overlay
|
||||
var/image/advanced_graffiti_overlay
|
||||
|
||||
/turf/simulated/proc/render_advanced_graffiti(var/mob/user)
|
||||
if (!advanced_graffiti)
|
||||
return FALSE
|
||||
overlays -= advanced_graffiti_overlay
|
||||
advanced_graffiti_overlay = advanced_graffiti.render_on(icon(icon, icon_state))
|
||||
advanced_graffiti_overlay = image(advanced_graffiti.render_on(icon(icon, icon_state)))
|
||||
advanced_graffiti_overlay.layer = ADVANCED_GRAFFITI_LAYER
|
||||
//advanced_graffiti_overlay.SwapColor("#aaaaaaff", "#ffffff00")
|
||||
overlays += advanced_graffiti_overlay
|
||||
|
||||
|
||||
@@ -73,6 +73,8 @@
|
||||
|
||||
var/mute_time = 0
|
||||
|
||||
var/datum/paint_overlay/paint_overlay = null
|
||||
|
||||
/turf/examine(mob/user)
|
||||
..()
|
||||
if(bullet_marks)
|
||||
@@ -141,6 +143,8 @@
|
||||
if(Obj.flags & PROXMOVE)
|
||||
spawn( 0 )
|
||||
Obj.HasProximity(A, 1)
|
||||
if (ishuman(A) && paint_overlay)
|
||||
paint_overlay.add_paint_to_feet(A)
|
||||
// THIS IS NOW TRANSIT STUFF
|
||||
if ((!(A) || src != A.loc))
|
||||
return
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
playsound(master, 'sound/effects/spray3.ogg', 15, 1)
|
||||
|
||||
A.ClearDecals()
|
||||
A.remove_paint_overlay(TRUE)
|
||||
|
||||
/datum/rcd_schematic/tile
|
||||
name = "Decals"
|
||||
@@ -180,6 +181,7 @@
|
||||
T.name = pname
|
||||
|
||||
T.ClearDecals()
|
||||
T.remove_paint_overlay(TRUE)
|
||||
|
||||
/datum/paint_info/decal
|
||||
icon = 'icons/effects/floor_decals.dmi'
|
||||
@@ -611,7 +613,7 @@ var/global/list/paint_variants = list(
|
||||
new /datum/paint_info(DIR_ALL, "chapel"),
|
||||
new /datum/paint_info(DIR_ONE, "chapeldark")
|
||||
),
|
||||
|
||||
|
||||
"Tatami" = list(
|
||||
new /datum/paint_info(DIR_ORTHO, "tatami-green-halfmat"),
|
||||
new /datum/paint_info(DIR_ONE, "tatami-green-1mat-hori"),
|
||||
|
||||
@@ -129,6 +129,11 @@
|
||||
blood_DNA_found[R.blood2.data["blood_DNA"]] = R.blood2.data["blood_type"]
|
||||
if (R.blood3)
|
||||
blood_DNA_found[R.blood3.data["blood_DNA"]] = R.blood3.data["blood_type"]
|
||||
if (istype(T,/turf/simulated/floor))
|
||||
var/turf/simulated/floor/S = T
|
||||
if (S.paint_overlay)
|
||||
for (var/entry in S.paint_overlay.blood_DNA)
|
||||
blood_DNA_found[entry] = S.paint_overlay.blood_DNA[entry]
|
||||
//General
|
||||
if (fingerprints_found.len == 0 && blood_DNA_found.len == 0 && fibers_found.len == 0)
|
||||
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
if (!T.lighting_corners_initialised)//may happen due to nano paint
|
||||
T.generate_missing_corners()
|
||||
|
||||
// To the future coder who sees this and thinks
|
||||
// "Why didn't he just use a loop?"
|
||||
// Well my man, it's because the loop performed like shit.
|
||||
@@ -69,13 +72,27 @@
|
||||
|
||||
var/max = max(cr.cache_mx, cg.cache_mx, cb.cache_mx, ca.cache_mx)
|
||||
|
||||
color = list(
|
||||
cr.cache_r, cr.cache_g, cr.cache_b, 0,
|
||||
cg.cache_r, cg.cache_g, cg.cache_b, 0,
|
||||
cb.cache_r, cb.cache_g, cb.cache_b, 0,
|
||||
ca.cache_r, ca.cache_g, ca.cache_b, 0,
|
||||
0, 0, 0, 1
|
||||
)
|
||||
if (T.paint_overlay && T.paint_overlay.nano_paint)
|
||||
var/list/RGB = rgb2num(T.paint_overlay.main_color)
|
||||
var/nano_R = RGB[1]/255
|
||||
var/nano_G = RGB[2]/255
|
||||
var/nano_B = RGB[3]/255
|
||||
max = max(max, nano_R, nano_G, nano_B)
|
||||
color = list(
|
||||
max(nano_R, cr.cache_r), max(nano_G, cr.cache_g), max(nano_B, cr.cache_b), 0,
|
||||
max(nano_R, cg.cache_r), max(nano_G, cg.cache_g), max(nano_B, cg.cache_b), 0,
|
||||
max(nano_R, cb.cache_r), max(nano_G, cb.cache_g), max(nano_B, cb.cache_b), 0,
|
||||
max(nano_R, ca.cache_r), max(nano_G, ca.cache_g), max(nano_B, ca.cache_b), 0,
|
||||
0, 0, 0, 1
|
||||
)
|
||||
else
|
||||
color = list(
|
||||
cr.cache_r, cr.cache_g, cr.cache_b, 0,
|
||||
cg.cache_r, cg.cache_g, cg.cache_b, 0,
|
||||
cb.cache_r, cb.cache_g, cb.cache_b, 0,
|
||||
ca.cache_r, ca.cache_g, ca.cache_b, 0,
|
||||
0, 0, 0, 1
|
||||
)
|
||||
luminosity = max > LIGHTING_SOFT_THRESHOLD
|
||||
|
||||
// Variety of overrides so the overlays don't get affected by weird things.
|
||||
|
||||
@@ -594,6 +594,7 @@
|
||||
/obj/item/weapon/switchtool/swiss_army_knife,
|
||||
/obj/item/clothing/accessory/wristwatch,
|
||||
/obj/item/clothing/accessory/wristwatch/black,
|
||||
/obj/item/high_roller,
|
||||
)
|
||||
|
||||
/obj/abstract/map/spawner/maint/lowchance
|
||||
|
||||
@@ -974,9 +974,48 @@
|
||||
update_inv_gloves() //handles bloody hands overlays and updating
|
||||
return TRUE //we applied blood to the item
|
||||
|
||||
/mob/living/carbon/human/clean_blood(var/clean_feet)
|
||||
/mob/living/carbon/human/proc/add_blood_to_feet(var/_amount, var/_color, var/list/_blood_DNA=list())
|
||||
if(shoes)
|
||||
var/obj/item/clothing/shoes/S = shoes
|
||||
S.track_blood = max(0, _amount, S.track_blood) //Adding blood to shoes
|
||||
|
||||
if(!blood_overlays["[S.type][S.icon_state]"]) //If there isn't a precreated blood overlay make one
|
||||
S.set_blood_overlay()
|
||||
|
||||
if(S.blood_overlay != null) // Just if(blood_overlay) doesn't work. Have to use isnull here.
|
||||
S.overlays.Remove(S.blood_overlay)
|
||||
else
|
||||
S.blood_overlay = blood_overlays["[S.type][S.icon_state]"]
|
||||
|
||||
if(!S.blood_DNA)
|
||||
S.blood_DNA = list()
|
||||
|
||||
var/newcolor = (S.blood_color && S.blood_DNA.len) ? BlendRYB(S.blood_color, _color, 0.5) : _color
|
||||
S.blood_overlay.color = newcolor
|
||||
S.overlays += S.blood_overlay
|
||||
S.blood_color = newcolor
|
||||
|
||||
if(_blood_DNA)
|
||||
S.blood_DNA |= _blood_DNA.Copy()
|
||||
update_inv_shoes(1)
|
||||
|
||||
else
|
||||
track_blood = max(_amount, 0, track_blood) //Or feet
|
||||
if(!feet_blood_DNA)
|
||||
feet_blood_DNA = list()
|
||||
|
||||
if(!istype(_blood_DNA, /list))
|
||||
_blood_DNA = list()
|
||||
else
|
||||
feet_blood_DNA |= _blood_DNA.Copy()
|
||||
|
||||
feet_blood_color = (feet_blood_color && feet_blood_DNA.len) ? BlendRYB(feet_blood_color, _color, 0.5) : _color
|
||||
|
||||
update_inv_shoes(1)
|
||||
|
||||
/mob/living/carbon/human/clean_blood()
|
||||
.=..()
|
||||
if(clean_feet && !shoes && istype(feet_blood_DNA, /list) && feet_blood_DNA.len)
|
||||
if(!shoes && istype(feet_blood_DNA, /list) && feet_blood_DNA.len)
|
||||
feet_blood_color = null
|
||||
feet_blood_DNA.len = 0
|
||||
update_inv_shoes(1)
|
||||
|
||||
@@ -948,8 +948,6 @@ var/global/list/damage_icon_parts = list()
|
||||
if("Insectoid")
|
||||
blood_icon_state = "shoeblood-vox"
|
||||
|
||||
//if bloody bare feet icons are added like with bloody hands, something should go here to avoid the blood showing where a missing foot would be
|
||||
|
||||
var/icon/shoebloodicon = icon('icons/effects/blood.dmi', blood_icon_state)
|
||||
|
||||
//only show blood on shoe on present foot
|
||||
@@ -958,17 +956,46 @@ var/global/list/damage_icon_parts = list()
|
||||
|
||||
var/image/bloodsies = image(shoebloodicon)
|
||||
bloodsies.color = shoes.blood_color
|
||||
//standing.overlays += bloodsies
|
||||
O.overlays += bloodsies
|
||||
//overlays_standing[SHOES_LAYER] = standing
|
||||
|
||||
shoes.generate_accessory_overlays(O)
|
||||
|
||||
O.pixel_x = species.inventory_offsets["[slot_shoes]"]["pixel_x"] * PIXEL_MULTIPLIER
|
||||
O.pixel_y = species.inventory_offsets["[slot_shoes]"]["pixel_y"] * PIXEL_MULTIPLIER
|
||||
obj_to_plane_overlay(O,SHOES_LAYER)
|
||||
//else
|
||||
//overlays_standing[SHOES_LAYER] = null
|
||||
else if (!shoes && !check_hidden_body_flags(HIDESHOES))//for bloody bare feet
|
||||
if(feet_blood_DNA && feet_blood_DNA.len)
|
||||
var/obj/abstract/Overlays/O = obj_overlays[SHOES_LAYER]
|
||||
O.color = null
|
||||
O.alpha = 1
|
||||
var/blood_icon_state = "shoeblood"
|
||||
var/onefootedmask
|
||||
if(!has_organ(LIMB_LEFT_FOOT))
|
||||
onefootedmask = "r"
|
||||
else if(!has_organ(LIMB_RIGHT_FOOT))
|
||||
onefootedmask = "l"
|
||||
switch(get_species())
|
||||
if("Vox")
|
||||
blood_icon_state = "shoeblood-vox"
|
||||
if("Insectoid")
|
||||
blood_icon_state = "shoeblood-vox"
|
||||
|
||||
var/icon/feetbloodicon = icon('icons/effects/blood.dmi', blood_icon_state)
|
||||
|
||||
//only show blood on present foot
|
||||
if(feetbloodicon)
|
||||
feetbloodicon.Blend(icon('icons/effects/blood.dmi', "mask_[onefootedmask]"), ICON_ADD)
|
||||
|
||||
var/image/bloodsies = image(feetbloodicon)
|
||||
bloodsies.color = feet_blood_color
|
||||
bloodsies.appearance_flags = RESET_ALPHA
|
||||
|
||||
O.overlays += bloodsies
|
||||
|
||||
O.pixel_x = species.inventory_offsets["[slot_shoes]"]["pixel_x"] * PIXEL_MULTIPLIER
|
||||
O.pixel_y = species.inventory_offsets["[slot_shoes]"]["pixel_y"] * PIXEL_MULTIPLIER
|
||||
obj_to_plane_overlay(O,SHOES_LAYER)
|
||||
|
||||
if(update_icons)
|
||||
update_icons()
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
update_icon()
|
||||
|
||||
//presumably this will allow painting on the floor, credit to Anonymous user No.453861032
|
||||
if(istype(target, /turf/simulated))
|
||||
if(istype(target, /turf/simulated))
|
||||
var/turf/simulated/the_turf = target
|
||||
var/datum/painting_utensil/p = new(user, src)
|
||||
if (!the_turf.advanced_graffiti)
|
||||
@@ -65,3 +65,359 @@
|
||||
the_turf.advanced_graffiti = advanced_graffiti
|
||||
the_turf.advanced_graffiti.interact(user, p)
|
||||
return
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/paint_roller
|
||||
name = "paint roller"
|
||||
desc = "Used to cover floors in paint more efficiently than by just dumping buckets on them."
|
||||
icon = 'icons/obj/painting_items.dmi'
|
||||
icon_state = "paint_roller"
|
||||
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/arts_n_crafts.dmi', "right_hand" = 'icons/mob/in-hand/right/arts_n_crafts.dmi')
|
||||
|
||||
w_class = W_CLASS_TINY
|
||||
starting_materials = list(MAT_PLASTIC = 50)
|
||||
autoignition_temperature=AUTOIGNITION_PLASTIC
|
||||
w_type = RECYK_PLASTIC
|
||||
siemens_coefficient = 0
|
||||
|
||||
var/paint_color = null
|
||||
var/paint_alpha = 255
|
||||
var/nano_paint = PAINTLIGHT_NONE
|
||||
var/list/blood_data = list("wet paint" = "paint")
|
||||
var/stroke_state = "border_roller"
|
||||
var/list/stroke_states = list(
|
||||
"Full Tile (default, takes 3 clicks)" = "border_roller",
|
||||
"Half Tile" = "border_half",
|
||||
"Quarter Tile" = "border_quarter",
|
||||
"Trim" = "border_trim",
|
||||
"Arrow" = "border_arrow",
|
||||
"Concave Corner" = "border_concave",
|
||||
"Convex Corner" = "border_convex",
|
||||
"Square Corner" = "border_corner",
|
||||
)//found in paint_masks.dmi
|
||||
|
||||
/obj/item/paint_roller/afterattack(obj/target, mob/living/user, proximity_flag, click_parameters)
|
||||
if(proximity_flag == 0) // not adjacent
|
||||
return
|
||||
|
||||
if(target.is_open_container() && target.reagents && !target.reagents.is_empty())
|
||||
var/cleaner_percent = get_reagent_paint_cleaning_percent(target)
|
||||
|
||||
if (cleaner_percent >= PAINT_CLEANER_THRESHOLD)
|
||||
paint_color = null
|
||||
nano_paint = PAINTLIGHT_NONE
|
||||
to_chat(user, "<span class='notice'>You clean \the [name] in \the [target.name].</span>")
|
||||
else
|
||||
// Take the pigment mix's color
|
||||
var/paint_rgb = mix_color_from_reagents(target.reagents.reagent_list, TRUE)
|
||||
if (!paint_rgb)
|
||||
to_chat(user, "<span class='notice'>Your [name] fails to grab any pigment from \the [target.name].</span>")
|
||||
return
|
||||
var/list/paint_color_rgb = rgb2num(paint_rgb)
|
||||
var/mix_alpha = mix_alpha_from_reagents(target.reagents.reagent_list)
|
||||
paint_color = rgb(paint_color_rgb[1], paint_color_rgb[2], paint_color_rgb[3], mix_alpha)
|
||||
paint_alpha = mix_alpha
|
||||
to_chat(user, "<span class='notice'>You dip \the [name] in \the [target.name].</span>")
|
||||
var/datum/reagent/B = get_blood(target.reagents)
|
||||
if (B)
|
||||
add_blood_from_data(B.data)
|
||||
blood_data = list(B.data["blood_DNA"] = B.data["blood_type"])
|
||||
else
|
||||
blood_data = list("wet paint" = "paint")
|
||||
update_icon()
|
||||
else if (isfloor(target))
|
||||
var/turf/F = target
|
||||
if (!paint_color)
|
||||
to_chat(user, "<span class='warning'>There is no paint on your roller.</span>")
|
||||
return
|
||||
var/turf/T = get_turf(user)
|
||||
var/_dir = user.dir
|
||||
if (T != F)
|
||||
_dir = get_dir_cardinal(F,T)
|
||||
F.apply_paint_stroke(paint_color, paint_alpha, _dir, stroke_state, blood_data, nano_paint == PAINTLIGHT_FULL)
|
||||
playsound(src, get_sfx("mop"), 5, 1)
|
||||
else if (iswall(target))
|
||||
var/turf/W = target
|
||||
if (!paint_color)
|
||||
to_chat(user, "<span class='warning'>There is no paint on your roller.</span>")
|
||||
return
|
||||
var/turf/T = get_turf(user)
|
||||
var/_dir = user.dir
|
||||
if (T != W)
|
||||
_dir = get_dir_cardinal(W,T)
|
||||
W.apply_paint_stroke(paint_color, paint_alpha, _dir, "wall_side", blood_data, nano_paint == PAINTLIGHT_FULL)
|
||||
playsound(src, get_sfx("mop"), 5, 1)
|
||||
else if (ishuman(target) && paint_color)
|
||||
var/mob/living/carbon/human/H = target
|
||||
var/paint_data = list(
|
||||
"viruses" =null,
|
||||
"blood_DNA" ="wet paint",
|
||||
"blood_colour" = paint_color,
|
||||
"blood_type" ="paint",
|
||||
"resistances" =null,
|
||||
"trace_chem" =null,
|
||||
"virus2" =list(),
|
||||
"immunity" =null,
|
||||
)
|
||||
if (user.zone_sel.selecting == LIMB_LEFT_HAND || user.zone_sel.selecting == LIMB_RIGHT_HAND)
|
||||
H.bloody_hands_from_data(copy_blood_data(paint_data),2,src)
|
||||
else if (user.zone_sel.selecting == LIMB_LEFT_FOOT || user.zone_sel.selecting == LIMB_RIGHT_FOOT)
|
||||
H.add_blood_to_feet(3, paint_color, list("wet paint" = "paint"))
|
||||
else
|
||||
H.bloody_body_from_data(copy_blood_data(paint_data),0,src)
|
||||
playsound(src, get_sfx("mop"), 5, 1)
|
||||
|
||||
/obj/item/paint_roller/update_icon()
|
||||
..()
|
||||
overlays.len = 0
|
||||
if (paint_color)
|
||||
var/image/covering = image(icon, src, "paint_roller_overlay")
|
||||
covering.color = paint_color
|
||||
overlays += covering
|
||||
//dynamic in-hand overlay
|
||||
var/image/paintleft = image(inhand_states["left_hand"], src, "paint_roller_pigments")
|
||||
var/image/paintright = image(inhand_states["right_hand"], src, "paint_roller_pigments")
|
||||
paintleft.color = paint_color
|
||||
paintright.color = paint_color
|
||||
dynamic_overlay["[HAND_LAYER]-[GRASP_LEFT_HAND]"] = paintleft
|
||||
dynamic_overlay["[HAND_LAYER]-[GRASP_RIGHT_HAND]"] = paintright
|
||||
else
|
||||
dynamic_overlay = list()
|
||||
update_blood_overlay()
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.update_inv_hands()
|
||||
|
||||
/obj/item/paint_roller/attack_self(var/mob/user)
|
||||
if (user.incapacitated() || !Adjacent(user))
|
||||
return
|
||||
var/choices = list()
|
||||
for(var/entry in stroke_states)
|
||||
choices += list(list(entry, stroke_states[entry], null))
|
||||
var/new_mode = show_radial_menu(user,user,choices,'icons/obj/paint_radial.dmi',radius = 42,custom_color = paint_color)
|
||||
if (!new_mode || user.incapacitated() || !Adjacent(user))
|
||||
return
|
||||
stroke_state = stroke_states[new_mode]
|
||||
|
||||
/obj/item/paint_roller/AltClick(var/mob/user)
|
||||
attack_self(user)
|
||||
|
||||
/obj/item/paint_roller/verb/set_painting_mode()
|
||||
set name = "Change painting mode"
|
||||
set category = "Object"
|
||||
set src in range(0)
|
||||
if(usr.incapacitated())
|
||||
return
|
||||
var/new_mode = input("Choose a painting mode","[src]") in stroke_states
|
||||
if (new_mode && !usr.incapacitated() && Adjacent(usr))
|
||||
stroke_state = stroke_states[new_mode]
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/obj/item/high_roller
|
||||
name = "high roller"
|
||||
desc = "Nyehaeh there's the high roller!"
|
||||
icon = 'icons/obj/painting_items.dmi'
|
||||
icon_state = "high_roller"
|
||||
item_state = "high_roller"
|
||||
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/arts_n_crafts.dmi', "right_hand" = 'icons/mob/in-hand/right/arts_n_crafts.dmi')
|
||||
origin_tech = Tc_MATERIALS + "=3;" + Tc_ENGINEERING + "=2;"
|
||||
w_class = W_CLASS_LARGE
|
||||
starting_materials = list(MAT_IRON = 9375)//half of the materials used to print one
|
||||
w_type = RECYK_METAL
|
||||
melt_temperature = MELTPOINT_STEEL
|
||||
flags = FPRINT | TWOHANDABLE | SLOWDOWN_WHEN_CARRIED
|
||||
slowdown = NO_SLOWDOWN//HIGHROLLER_SLOWDOWN when active
|
||||
|
||||
var/obj/item/weapon/reagent_containers/container = null
|
||||
var/mixed_color = "#ffffff"
|
||||
var/mixed_alpha = 255
|
||||
var/pigment_color = "#ffffff"
|
||||
|
||||
/obj/item/high_roller/attack_self(mob/user)
|
||||
if(wielded)
|
||||
unwield(user)
|
||||
user.unregister_event(/event/after_move, src, /obj/item/high_roller/proc/swipe_turf)
|
||||
else
|
||||
wield(user)
|
||||
if(wielded)
|
||||
user.register_event(/event/after_move, src, /obj/item/high_roller/proc/swipe_turf)
|
||||
if (!container)
|
||||
to_chat(user, "<span class='warning'>You need to slot in a reagent container before you can use the roller.</span>")
|
||||
|
||||
/obj/item/high_roller/attack_hand(var/mob/living/user)
|
||||
if (container && (user.get_inactive_hand() == src))
|
||||
user.put_in_hands(container)
|
||||
container = null
|
||||
playsound(user.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
update_icon()
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/high_roller/splashable()
|
||||
return FALSE
|
||||
|
||||
/obj/item/high_roller/update_wield(mob/user)
|
||||
if(wielded)
|
||||
slowdown = HIGHROLLER_SLOWDOWN
|
||||
else
|
||||
slowdown = NO_SLOWDOWN
|
||||
update_icon()
|
||||
|
||||
/obj/item/high_roller/attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/weapon/reagent_containers))
|
||||
if(!W.is_open_container())
|
||||
to_chat(user, "<span class='warning'>The container must be open to get properly slotted onto the roller.</span>")
|
||||
return
|
||||
if(user.drop_item(W, src))
|
||||
if (container)
|
||||
user.put_in_hands(container)
|
||||
to_chat(user, "You swap the containers.")
|
||||
else
|
||||
to_chat(user, "You slot the container on the roller.")
|
||||
container = W
|
||||
playsound(user.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
mixed_color = mix_color_from_reagents(container.reagents.reagent_list)
|
||||
mixed_alpha = mix_alpha_from_reagents(container.reagents.reagent_list)
|
||||
pigment_color = mix_color_from_reagents(container.reagents.reagent_list, TRUE)
|
||||
update_icon()
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/high_roller/afterattack(obj/target, mob/user, proximity_flag, click_parameters)
|
||||
if(proximity_flag == 0) // not adjacent
|
||||
return
|
||||
if (isshelf(target))
|
||||
return
|
||||
if(target.is_open_container() && target.reagents && !target.reagents.is_empty())
|
||||
to_chat(user, "<span class='warning'>The roller is too large to get dipped in that. You need to slot in a reagent container instead.</span>")
|
||||
return
|
||||
var/turf/T = get_turf(target)
|
||||
swipe_turf(T)
|
||||
|
||||
/obj/item/high_roller/AltClick(var/mob/user)
|
||||
if (user.incapacitated() || !Adjacent(user))
|
||||
return
|
||||
if (!container)
|
||||
to_chat(user, "<span class='warning'>There is no container to remove.</span>")
|
||||
return
|
||||
if(wielded)
|
||||
unwield(user)
|
||||
user.unregister_event(/event/after_move, src, /obj/item/high_roller/proc/swipe_turf)
|
||||
user.put_in_hands(container)
|
||||
container = null
|
||||
playsound(user.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
update_icon()
|
||||
|
||||
/obj/item/high_roller/verb/remove_container()
|
||||
set name = "Remove container"
|
||||
set category = "Object"
|
||||
set src in range(0)
|
||||
var/mob/user = usr
|
||||
if(user.incapacitated() || !Adjacent(user))
|
||||
return
|
||||
if (!container)
|
||||
to_chat(user, "<span class='warning'>There is no container to remove.</span>")
|
||||
return
|
||||
if(wielded)
|
||||
unwield(user)
|
||||
user.unregister_event(/event/after_move, src, /obj/item/high_roller/proc/swipe_turf)
|
||||
user.put_in_hands(container)
|
||||
container = null
|
||||
playsound(user.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
update_icon()
|
||||
|
||||
/obj/item/high_roller/update_icon()
|
||||
..()
|
||||
overlays.len = 0
|
||||
|
||||
if (wielded)
|
||||
item_state = "high_roller_deployed"
|
||||
else
|
||||
item_state = "high_roller"
|
||||
|
||||
var/image/rollerhandleft = image(inhand_states["left_hand"], src, "palette-color")//blank
|
||||
var/image/rollerhandright = image(inhand_states["right_hand"], src, "palette-color")
|
||||
|
||||
if (container)
|
||||
var/image/container_color = image(icon, src, "high_roller_container")
|
||||
|
||||
var/image/container_color_handleft = image(inhand_states["left_hand"], src, "[item_state]_container")
|
||||
var/image/container_color_handright = image(inhand_states["right_hand"], src, "[item_state]_container")
|
||||
|
||||
if (container.reagents.total_volume)
|
||||
container_color.color = mixed_color
|
||||
container_color.alpha = mixed_alpha
|
||||
container_color_handleft.color = mixed_color
|
||||
container_color_handleft.alpha = mixed_alpha
|
||||
container_color_handright.color = mixed_color
|
||||
container_color_handright.alpha = mixed_alpha
|
||||
|
||||
var/image/container_fillings = image(icon, src, "high_roller_fillings[clamp(round(9*container.reagents.total_volume/container.reagents.maximum_volume),1,9)]")
|
||||
container_fillings.color = mixed_color
|
||||
container_fillings.alpha = mixed_alpha
|
||||
overlays += container_fillings
|
||||
|
||||
if (pigment_color)
|
||||
var/image/paint_color = image(icon, src, "high_roller_pigments")
|
||||
paint_color.color = pigment_color
|
||||
paint_color.alpha = mixed_alpha
|
||||
overlays += paint_color
|
||||
|
||||
var/image/pigment_color_handleft = image(inhand_states["left_hand"], src, "[item_state]_pigments")
|
||||
pigment_color_handleft.color = pigment_color
|
||||
pigment_color_handleft.alpha = mixed_alpha
|
||||
rollerhandleft.overlays += pigment_color_handleft
|
||||
var/image/pigment_color_handright = image(inhand_states["right_hand"], src, "[item_state]_pigments")
|
||||
pigment_color_handright.color = pigment_color
|
||||
pigment_color_handright.alpha = mixed_alpha
|
||||
rollerhandright.overlays += pigment_color_handright
|
||||
|
||||
overlays += container_color
|
||||
rollerhandleft.overlays += container_color_handleft
|
||||
rollerhandright.overlays += container_color_handright
|
||||
|
||||
dynamic_overlay["[HAND_LAYER]-[GRASP_LEFT_HAND]"] = rollerhandleft
|
||||
dynamic_overlay["[HAND_LAYER]-[GRASP_RIGHT_HAND]"] = rollerhandright
|
||||
|
||||
update_blood_overlay()
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.update_inv_hands()
|
||||
|
||||
/obj/item/high_roller/dropped(var/mob/user)
|
||||
if(wielded)
|
||||
unwield(user)
|
||||
user.unregister_event(/event/after_move, src, /obj/item/high_roller/proc/swipe_turf)
|
||||
..()
|
||||
|
||||
/obj/item/high_roller/proc/swipe_turf(var/turf/T)
|
||||
if (!T)
|
||||
T = get_turf(src)
|
||||
if (!T)
|
||||
return
|
||||
|
||||
var/mob/user = loc
|
||||
if(container && container.reagents.total_volume)
|
||||
for(var/datum/reagent/R in container.reagents.reagent_list)
|
||||
for (var/mob/M in T.contents)
|
||||
if (M.lying)
|
||||
R.reaction_mob(M, TOUCH, 5, ALL_LIMBS, FALSE)
|
||||
add_logs(user, M, "rolled over", admin = TRUE, object = src, addition = "Reagents: [english_list(container.get_reagent_names())]")
|
||||
|
||||
var/list/blood_data = list("wet paint" = "paint")
|
||||
if (R.id == BLOOD)
|
||||
blood_data = list(R.data["blood_DNA"] = R.data["blood_type"])
|
||||
|
||||
if (R.flags & CHEMFLAG_PIGMENT)
|
||||
T.apply_paint_overlay(R.color, R.alpha, blood_data, R.paint_light == PAINTLIGHT_FULL)
|
||||
else
|
||||
R.reaction_turf(T, 5)
|
||||
|
||||
container.reagents.remove_from_all(1)
|
||||
container.reagents.handle_special_behaviours()
|
||||
playsound(T, get_sfx("mop"), 5, 1)
|
||||
anim(target = T, a_icon = 'icons/effects/effects.dmi', flick_anim = "wfoam-disolve", lay = SNOW_LAYER, col = mixed_color, alph = mixed_alpha, plane = ABOVE_TURF_PLANE)
|
||||
update_icon()
|
||||
|
||||
@@ -261,3 +261,11 @@ interactions:
|
||||
resultRyb["y"] = round(alpha * c1Ryb["y"] + (1-alpha) * c2Ryb["y"])
|
||||
resultRyb["b"] = round(alpha * c1Ryb["b"] + (1-alpha) * c2Ryb["b"])
|
||||
return rybToRgb(resultRyb)
|
||||
|
||||
/proc/BlendRYB(rgb1, rgb2, amount)
|
||||
if (length(rgb1) < 8)
|
||||
rgb1 += "FF"
|
||||
if (length(rgb2) < 8)
|
||||
rgb2 += "FF"
|
||||
var/blend = colorRybBlend(rgb2num(rgb1), rgb2num(rgb2), amount)
|
||||
return rgb(blend[1], blend[2], blend[3], blend[4], "COLORSPACE_RGB")
|
||||
|
||||
@@ -117,6 +117,14 @@ var/const/INGEST = 2
|
||||
handle_reactions()
|
||||
return total_transfered
|
||||
|
||||
/datum/reagents/proc/remove_from_all(var/amount=1)
|
||||
for(var/datum/reagent/R in reagent_list)
|
||||
remove_reagent(R.id, (R.volume/total_volume) * amount)
|
||||
if (R.volume < 0.01)
|
||||
del_reagent(R.id,update_totals=0)
|
||||
|
||||
return amount
|
||||
|
||||
/datum/reagents/proc/get_master_reagent()
|
||||
var/the_reagent = null
|
||||
var/the_volume = 0
|
||||
@@ -769,6 +777,8 @@ trans_to_atmos(var/datum/gas_mixture/target, var/amount=1, var/multiplier=1, var
|
||||
|
||||
return 1
|
||||
|
||||
/datum/reagents/proc/handle_special_behaviours()
|
||||
|
||||
/datum/reagents/proc/remove_reagent(var/reagent, var/amount, var/safety)//Added a safety check for the trans_id_to
|
||||
|
||||
if(!isnum(amount))
|
||||
@@ -992,6 +1002,12 @@ trans_to_atmos(var/datum/gas_mixture/target, var/amount=1, var/multiplier=1, var
|
||||
/datum/reagents/proc/is_full()
|
||||
return total_volume >= maximum_volume
|
||||
|
||||
/datum/reagents/proc/get_max_paint_light()
|
||||
var/max_paint_light = PAINTLIGHT_NONE
|
||||
for (var/datum/reagent/R in reagent_list)
|
||||
max_paint_light = max(max_paint_light, R.paint_light)
|
||||
return max_paint_light
|
||||
|
||||
/datum/reagents/proc/get_overall_mass() //currently unused
|
||||
//M = DV
|
||||
var/overall_mass = 0
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
var/mug_desc = null
|
||||
var/addictive = FALSE
|
||||
var/tolerance_increase = null //for tolerance, if set above 0, will increase each by that amount on tick.
|
||||
var/paint_light = PAINTLIGHT_NONE
|
||||
|
||||
/datum/reagent/proc/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
|
||||
set waitfor = 0
|
||||
|
||||
@@ -28,6 +28,16 @@
|
||||
materials = list(MAT_GLASS = 8000, MAT_IRON=2000)
|
||||
category = "Misc"
|
||||
|
||||
/datum/design/high_roller
|
||||
name = "High Roller"
|
||||
desc = "A large two-handed paint roller that can cover floors and walls in paint much quicker than with a regular paint roller. Although you can use it to spread any reagent."
|
||||
id = "high_roller"
|
||||
build_type = PROTOLATHE
|
||||
build_path = /obj/item/high_roller
|
||||
req_tech = list(Tc_ENGINEERING = 2, Tc_MATERIALS = 3)
|
||||
materials = list(MAT_IRON=18750)
|
||||
category = "Misc"
|
||||
|
||||
/datum/design/mannequin_frame
|
||||
name = "Cyber Mannequin Frame"
|
||||
desc = "So much effort just just display material goods."
|
||||
|
||||
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 110 KiB |
BIN
icons/mob/in-hand/left/arts_n_crafts.dmi
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
icons/mob/in-hand/right/arts_n_crafts.dmi
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 77 KiB |
BIN
icons/obj/paint_radial.dmi
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
icons/obj/tiles.dmi
Normal file
|
After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 488 KiB After Width: | Height: | Size: 479 KiB |
BIN
icons/turf/paint_masks.dmi
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
icons/turf/paint_overlays_floors.dmi
Normal file
|
After Width: | Height: | Size: 607 KiB |
BIN
icons/turf/paint_overlays_walls.dmi
Normal file
|
After Width: | Height: | Size: 348 KiB |
@@ -1333,6 +1333,8 @@
|
||||
#include "code\game\striketeams\nanotrasen_deathsquad.dm"
|
||||
#include "code\game\striketeams\striketeam_datums.dm"
|
||||
#include "code\game\striketeams\syndicate_elite_squad.dm"
|
||||
#include "code\game\turfs\paint_overlay.dm"
|
||||
#include "code\game\turfs\paint_overlay_overrides.dm"
|
||||
#include "code\game\turfs\portal.dm"
|
||||
#include "code\game\turfs\simulated.dm"
|
||||
#include "code\game\turfs\turf.dm"
|
||||
|
||||