mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-07-20 20:54:35 +01:00
Merge branch 'master' into upstream-merge-10123
This commit is contained in:
@@ -80,6 +80,8 @@
|
||||
#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon"
|
||||
///from base of atom/Entered(): (atom/movable/entering, /atom)
|
||||
#define COMSIG_ATOM_ENTERED "atom_entered"
|
||||
/// Sent from the atom that just Entered src. From base of atom/Entered(): (/atom/entered_atom, /atom/oldLoc)
|
||||
#define COMSIG_ATOM_ENTERING "atom_entering"
|
||||
///from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc)
|
||||
#define COMSIG_ATOM_EXIT "atom_exit"
|
||||
#define COMPONENT_ATOM_BLOCK_EXIT (1<<0)
|
||||
|
||||
@@ -67,6 +67,11 @@
|
||||
#define MAT_PLASTITANIUMGLASS "plastitanium glass"
|
||||
#define MAT_GOLDHULL "gold hull"
|
||||
|
||||
#define RESIZE_MINIMUM 0.25
|
||||
#define RESIZE_MAXIMUM 2
|
||||
#define RESIZE_MINIMUM_DORMS 0.01
|
||||
#define RESIZE_MAXIMUM_DORMS 6
|
||||
|
||||
#define RESIZE_HUGE 2
|
||||
#define RESIZE_BIG 1.5
|
||||
#define RESIZE_NORMAL 1
|
||||
|
||||
@@ -233,4 +233,3 @@
|
||||
'sound/ambience/engineering/engineering3.ogg',\
|
||||
'sound/ambience/atmospherics/atmospherics1.ogg'\
|
||||
)
|
||||
|
||||
|
||||
@@ -58,7 +58,8 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
#define INIT_ORDER_SKYBOX 30
|
||||
#define INIT_ORDER_MAPPING 25
|
||||
#define INIT_ORDER_DECALS 20
|
||||
#define INIT_ORDER_PLANTS 18 // Must initialize before atoms.
|
||||
#define INIT_ORDER_PLANTS 19 // Must initialize before atoms.
|
||||
#define INIT_ORDER_PLANETS 18
|
||||
#define INIT_ORDER_JOB 17
|
||||
#define INIT_ORDER_ALARM 16 // Must initialize before atoms.
|
||||
#define INIT_ORDER_ATOMS 15
|
||||
@@ -69,7 +70,6 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
|
||||
#define INIT_ORDER_LIGHTING 0
|
||||
#define INIT_ORDER_AIR -1
|
||||
#define INIT_ORDER_ASSETS -3
|
||||
#define INIT_ORDER_PLANETS -4
|
||||
#define INIT_ORDER_HOLOMAPS -5
|
||||
#define INIT_ORDER_NIGHTSHIFT -6
|
||||
#define INIT_ORDER_OVERLAY -7
|
||||
|
||||
@@ -6,9 +6,6 @@ SUBSYSTEM_DEF(planets)
|
||||
flags = SS_BACKGROUND
|
||||
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
|
||||
|
||||
var/static/list/new_outdoor_turfs = list()
|
||||
var/static/list/new_outdoor_walls = list()
|
||||
|
||||
var/static/list/planets = list()
|
||||
var/static/list/z_to_planet = list()
|
||||
|
||||
@@ -20,7 +17,6 @@ SUBSYSTEM_DEF(planets)
|
||||
/datum/controller/subsystem/planets/Initialize(timeofday)
|
||||
admin_notice("<span class='danger'>Initializing planetary weather.</span>", R_DEBUG)
|
||||
createPlanets()
|
||||
allocateTurfs(TRUE)
|
||||
..()
|
||||
|
||||
/datum/controller/subsystem/planets/proc/createPlanets()
|
||||
@@ -36,64 +32,36 @@ SUBSYSTEM_DEF(planets)
|
||||
continue
|
||||
z_to_planet[Z] = NP
|
||||
|
||||
/datum/controller/subsystem/planets/proc/addTurf(var/turf/T,var/is_edge)
|
||||
if(is_edge)
|
||||
new_outdoor_walls |= T
|
||||
else
|
||||
new_outdoor_turfs |= T
|
||||
// DO NOT CALL THIS DIRECTLY UNLESS IT'S IN INITIALIZE,
|
||||
// USE turf/simulated/proc/make_indoors() and\
|
||||
// tyrf/simulated/proc/make_outdoors()
|
||||
/datum/controller/subsystem/planets/proc/addTurf(var/turf/T)
|
||||
if(z_to_planet.len >= T.z && z_to_planet[T.z])
|
||||
var/datum/planet/P = z_to_planet[T.z]
|
||||
if(!istype(P))
|
||||
return
|
||||
if(istype(T, /turf/unsimulated/wall/planetary))
|
||||
P.planet_walls += T
|
||||
else if(istype(T, /turf/simulated) && T.outdoors)
|
||||
P.planet_floors += T
|
||||
T.vis_contents |= P.weather_holder.visuals
|
||||
T.vis_contents |= P.weather_holder.special_visuals
|
||||
|
||||
|
||||
/datum/controller/subsystem/planets/proc/removeTurf(var/turf/T,var/is_edge)
|
||||
if(is_edge)
|
||||
new_outdoor_walls -= T
|
||||
else
|
||||
new_outdoor_turfs -= T
|
||||
|
||||
if(z_to_planet.len >= T.z)
|
||||
var/datum/planet/P = z_to_planet[T.z]
|
||||
if(!P)
|
||||
return
|
||||
if(is_edge)
|
||||
P.planet_floors -= T
|
||||
else
|
||||
if(istype(T, /turf/unsimulated/wall/planetary))
|
||||
P.planet_walls -= T
|
||||
T.vis_contents -= P.weather_holder.visuals
|
||||
T.vis_contents -= P.weather_holder.special_visuals
|
||||
|
||||
/datum/controller/subsystem/planets/proc/allocateTurfs(var/initial = FALSE)
|
||||
var/list/currentlist = new_outdoor_turfs
|
||||
while(currentlist.len)
|
||||
var/turf/simulated/OT = currentlist[currentlist.len]
|
||||
currentlist.len--
|
||||
if(istype(OT) && OT.outdoors && z_to_planet.len >= OT.z && z_to_planet[OT.z])
|
||||
var/datum/planet/P = z_to_planet[OT.z]
|
||||
P.planet_floors |= OT
|
||||
OT.vis_contents |= P.weather_holder.visuals
|
||||
OT.vis_contents |= P.weather_holder.special_visuals
|
||||
if(!initial && MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
currentlist = new_outdoor_walls
|
||||
while(currentlist.len)
|
||||
var/turf/unsimulated/wall/planetary/PW = currentlist[currentlist.len]
|
||||
currentlist.len--
|
||||
if(istype(PW) && z_to_planet.len >= PW.z && z_to_planet[PW.z])
|
||||
var/datum/planet/P = z_to_planet[PW.z]
|
||||
P.planet_walls |= PW
|
||||
if(!initial && MC_TICK_CHECK)
|
||||
return
|
||||
|
||||
/datum/controller/subsystem/planets/proc/unallocateTurf(var/turf/simulated/T)
|
||||
if(istype(T) && z_to_planet[T.z])
|
||||
var/datum/planet/P = z_to_planet[T.z]
|
||||
P.planet_floors -= T
|
||||
T.vis_contents -= P.weather_holder.visuals
|
||||
T.vis_contents -= P.weather_holder.special_visuals
|
||||
else
|
||||
P.planet_floors -= T
|
||||
T.vis_contents -= P.weather_holder.visuals
|
||||
T.vis_contents -= P.weather_holder.special_visuals
|
||||
|
||||
|
||||
/datum/controller/subsystem/planets/fire(resumed = 0)
|
||||
if(new_outdoor_turfs.len || new_outdoor_walls.len)
|
||||
allocateTurfs()
|
||||
|
||||
if(!resumed)
|
||||
src.currentrun = planets.Copy()
|
||||
|
||||
@@ -153,8 +121,7 @@ SUBSYSTEM_DEF(planets)
|
||||
var/lum_g = new_brightness * GetGreenPart(new_color) / 255
|
||||
var/lum_b = new_brightness * GetBluePart (new_color) / 255
|
||||
var/static/update_gen = -1 // Used to prevent double-processing corners. Otherwise would happen when looping over adjacent turfs.
|
||||
for(var/I in P.planet_floors)
|
||||
var/turf/simulated/T = I
|
||||
for(var/turf/simulated/T as anything in P.planet_floors)
|
||||
if(!T.lighting_corners_initialised)
|
||||
T.generate_missing_corners()
|
||||
for(var/C in T.get_corners())
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
I = new path()
|
||||
|
||||
if(!I) // Something has gone horribly wrong, or right.
|
||||
log_debug("[name] created an Autolathe design without an assigned path. This is expected for only the Material Sheet generation.")
|
||||
log_debug("[name] created an Autolathe design without an assigned path.")
|
||||
return
|
||||
|
||||
if(I.matter && !resources)
|
||||
@@ -80,22 +80,12 @@
|
||||
if(istype(M, /datum/material/alienalloy))
|
||||
continue
|
||||
|
||||
var/obj/item/stack/material/Mat = new M.stack_type()
|
||||
|
||||
if(Mat.name in items_by_name)
|
||||
qdel(Mat)
|
||||
var/obj/item/stack/material/S = M.stack_type
|
||||
if(initial(S.name) in items_by_name)
|
||||
continue
|
||||
|
||||
var/datum/category_item/autolathe/materials/WorkDat = new(src)
|
||||
var/datum/category_item/autolathe/materials/WorkDat = new(src, M)
|
||||
|
||||
WorkDat.name = "[Mat.name]"
|
||||
WorkDat.resources = Mat.matter.Copy()
|
||||
WorkDat.is_stack = TRUE
|
||||
WorkDat.no_scale = TRUE
|
||||
WorkDat.max_stack = Mat.max_amount
|
||||
WorkDat.path = M.stack_type
|
||||
|
||||
qdel(Mat)
|
||||
|
||||
items |= WorkDat
|
||||
items_by_name[WorkDat.name] = WorkDat
|
||||
|
||||
@@ -1,38 +1,23 @@
|
||||
|
||||
/datum/category_item/autolathe/materials/metal
|
||||
name = "steel sheets"
|
||||
path =/obj/item/stack/material/steel
|
||||
/datum/category_item/autolathe/materials
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
no_scale = TRUE //Prevents material duplication exploits
|
||||
|
||||
/datum/category_item/autolathe/materials/glass
|
||||
name = "glass sheets"
|
||||
path =/obj/item/stack/material/glass
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
/datum/category_item/autolathe/materials/New(var/loc, var/mat)
|
||||
if(istype(mat, /obj/item/stack/material))
|
||||
var/obj/item/stack/material/M = mat
|
||||
name = M.name
|
||||
resources = M.matter.Copy()
|
||||
max_stack = M.max_amount
|
||||
path = M.type
|
||||
else if(istype(mat, /datum/material))
|
||||
var/datum/material/M = mat
|
||||
var/obj/item/stack/material/S = M.stack_type
|
||||
name = initial(S.name)
|
||||
resources = M.get_matter()
|
||||
max_stack = initial(S.max_amount)
|
||||
path = S
|
||||
. = ..()
|
||||
|
||||
/datum/category_item/autolathe/materials/rglass
|
||||
name = "reinforced glass sheets"
|
||||
path =/obj/item/stack/material/glass/reinforced
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
/datum/category_item/autolathe/materials/rods
|
||||
/datum/category_item/autolathe/materials/rods //Not strictly a material, so they need their own define
|
||||
name = "metal rods"
|
||||
path =/obj/item/stack/rods
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
|
||||
/datum/category_item/autolathe/materials/plasteel
|
||||
name = "plasteel sheets"
|
||||
path =/obj/item/stack/material/plasteel
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
resources = list(MAT_PLASTEEL = 2000)
|
||||
|
||||
/datum/category_item/autolathe/materials/plastic
|
||||
name = "plastic sheets"
|
||||
path =/obj/item/stack/material/plastic
|
||||
is_stack = TRUE
|
||||
no_scale = TRUE //prevents material duplication exploits
|
||||
resources = list(MAT_PLASTIC = 2000)
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
/datum/component/resize_guard
|
||||
|
||||
/datum/component/resize_guard/Initialize()
|
||||
if(!isliving(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
|
||||
/datum/component/resize_guard/RegisterWithParent()
|
||||
// When our parent mob enters any atom, we check resize
|
||||
RegisterSignal(parent, COMSIG_ATOM_ENTERING, .proc/check_resize)
|
||||
|
||||
/datum/component/resize_guard/UnregisterFromParent()
|
||||
UnregisterSignal(parent, COMSIG_ATOM_ENTERING)
|
||||
|
||||
/datum/component/resize_guard/proc/check_resize()
|
||||
var/area/A = get_area(parent)
|
||||
if(A?.limit_mob_size)
|
||||
var/mob/living/L = parent
|
||||
L.resize(L.size_multiplier)
|
||||
qdel(src)
|
||||
@@ -638,6 +638,7 @@
|
||||
. = ..()
|
||||
GLOB.moved_event.raise_event(AM, old_loc, AM.loc)
|
||||
SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, old_loc)
|
||||
SEND_SIGNAL(AM, COMSIG_ATOM_ENTERING, src, old_loc)
|
||||
|
||||
/atom/Exit(atom/movable/AM, atom/new_loc)
|
||||
. = ..()
|
||||
|
||||
@@ -222,7 +222,7 @@
|
||||
// Playerscale
|
||||
var/size = dna.GetUIValueRange(DNA_UI_PLAYERSCALE, player_sizes_list.len)
|
||||
if((0 < size) && (size <= player_sizes_list.len))
|
||||
H.resize(player_sizes_list[player_sizes_list[size]], TRUE)
|
||||
H.resize(player_sizes_list[player_sizes_list[size]], TRUE, ignore_prefs = TRUE)
|
||||
|
||||
// Tail/Taur Color
|
||||
H.r_tail = dna.GetUIValueRange(DNA_UI_TAIL_R, 255)
|
||||
@@ -243,7 +243,7 @@
|
||||
H.custom_exclaim = dna.custom_exclaim
|
||||
H.species.blood_color = dna.blood_color
|
||||
var/datum/species/S = H.species
|
||||
S.produceCopy(dna.base_species,dna.species_traits,src)
|
||||
S.produceCopy(dna.species_traits,src)
|
||||
// VOREStation Edit End
|
||||
|
||||
H.force_update_organs() //VOREStation Add - Gotta do this too
|
||||
|
||||
@@ -126,9 +126,9 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t
|
||||
|
||||
if(8) //Aug
|
||||
switch(DD)
|
||||
/* if(10)
|
||||
Holiday["S'randarr's Day"] = "A Tajaran holiday that occurs on the longest day of the year in summer,
|
||||
on Ahdomai. It is named after the Tajaran deity of Light, and huge celebrations are common." */
|
||||
// if(10)
|
||||
// Holiday["S'randarr's Day"] = "A Tajaran holiday that occurs on the longest day of the year in summer,
|
||||
// on Ahdomai. It is named after the Tajaran deity of Light, and huge celebrations are common."
|
||||
//VOREStation Add - Of course we need this.
|
||||
if(8)
|
||||
Holiday["Vore Day"] = "A holiday representing the innate desire in all/most/some/a few of us to devour each other or be devoured. \
|
||||
@@ -167,10 +167,10 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t
|
||||
Holiday["Kindness Day"] = "Kindness Day is an unofficial holiday to highlight good deeds in the \
|
||||
community, focusing on the positive power and the common thread of kindness which binds humanity and \
|
||||
friends together."
|
||||
/* if(28) //Space thanksgiving.
|
||||
if(28) //Space thanksgiving.
|
||||
Holiday["Appreciation Day"] = "Originally an old holiday from Earth, Appreciation Day follows many of the \
|
||||
traditions that its predecessor did, such as having a large feast (turkey often included), gathering with family, and being thankful \
|
||||
for what one has in life." */
|
||||
for what one has in life."
|
||||
if(28 > DD > 20)
|
||||
if(time2text(world.timeofday, "Day") == "Thursday")
|
||||
Holiday["Thanksgiving"] = "Originally an old holiday from Earth, Thanksgiving follows many of the \
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
"wizard's cloak" = "wizard_cloak"
|
||||
)
|
||||
|
||||
/* Some spell-specific variables go here, since spells themselves are temporary. Cores are more long term and more accessable than
|
||||
mind datums. It may also allow creative players to try to pull off a 'soul jar' scenario. */
|
||||
// Some spell-specific variables go here, since spells themselves are temporary. Cores are more long term and more accessable than
|
||||
// mind datums. It may also allow creative players to try to pull off a 'soul jar' scenario.
|
||||
var/list/summoned_mobs = list() // Maintained horribly with maintain_summon_list().
|
||||
var/list/wards_in_use = list() // Wards don't count against the cap for other summons.
|
||||
var/max_summons = 10 // Maximum allowed summoned entities. Some cores will have different caps.
|
||||
@@ -365,4 +365,4 @@
|
||||
instability_modifier = 0.3
|
||||
spell_power_modifier = 0.7
|
||||
universal = TRUE
|
||||
//VOREStation Add End
|
||||
//VOREStation Add End
|
||||
|
||||
@@ -31,10 +31,14 @@ var/list/turf_edge_cache = list()
|
||||
return ..()
|
||||
|
||||
/turf/simulated/proc/make_outdoors()
|
||||
if(outdoors)
|
||||
return
|
||||
outdoors = TRUE
|
||||
SSplanets.addTurf(src)
|
||||
|
||||
/turf/simulated/proc/make_indoors()
|
||||
if(!outdoors)
|
||||
return
|
||||
outdoors = FALSE
|
||||
SSplanets.removeTurf(src)
|
||||
|
||||
|
||||
@@ -4,13 +4,21 @@
|
||||
set category = "Fun"
|
||||
if(!check_rights(R_ADMIN, R_FUN))
|
||||
return
|
||||
|
||||
var/size_multiplier = input(usr, "Input size multiplier.", "Resize", 1)
|
||||
L.resize(size_multiplier, TRUE, TRUE)
|
||||
if(size_multiplier >= RESIZE_TINY && size_multiplier <= RESIZE_HUGE)
|
||||
L.size_uncapped = FALSE
|
||||
else
|
||||
L.size_uncapped = TRUE
|
||||
|
||||
var/size_multiplier = input(usr, "Input size multiplier.", "Resize", 1) as num|null
|
||||
if(!size_multiplier)
|
||||
return //cancelled
|
||||
|
||||
size_multiplier = clamp(size_multiplier, 0.01, 1000)
|
||||
var/can_be_big = L.has_large_resize_bounds()
|
||||
var/very_big = is_extreme_size(size_multiplier)
|
||||
|
||||
if(very_big && can_be_big) // made an extreme size in an area that allows it, don't assume adminbuse
|
||||
to_chat(src,"<span class='warning'>[L] will lose this size upon moving into an area where this size is not allowed.</span>")
|
||||
else if(very_big) // made an extreme size in an area that doesn't allow it, assume adminbuse
|
||||
to_chat(src,"<span class='warning'>[L] will retain this normally unallowed size outside this area.</span>")
|
||||
|
||||
L.resize(size_multiplier, animate = TRUE, uncapped = TRUE, ignore_prefs = TRUE)
|
||||
|
||||
log_and_message_admins("has changed [key_name(L)]'s size multiplier to [size_multiplier].")
|
||||
feedback_add_details("admin_verb","RESIZE")
|
||||
@@ -45,7 +45,7 @@
|
||||
character.weight_gain = pref.weight_gain
|
||||
character.weight_loss = pref.weight_loss
|
||||
character.fuzzy = pref.fuzzy
|
||||
character.resize(pref.size_multiplier, animate = FALSE)
|
||||
character.resize(pref.size_multiplier, animate = FALSE, ignore_prefs = TRUE)
|
||||
|
||||
/datum/category_item/player_setup_item/vore/size/content(var/mob/user)
|
||||
. += "<br>"
|
||||
|
||||
@@ -114,12 +114,7 @@
|
||||
pref.dirty_synth = 0
|
||||
|
||||
var/datum/species/S = character.species
|
||||
var/SB
|
||||
if(S.selects_bodytype)
|
||||
SB = pref.custom_base ? pref.custom_base : "Human"
|
||||
else
|
||||
SB = S.name
|
||||
var/datum/species/new_S = S.produceCopy(SB, pref.pos_traits + pref.neu_traits + pref.neg_traits, character)
|
||||
var/datum/species/new_S = S.produceCopy(pref.pos_traits + pref.neu_traits + pref.neg_traits, character, pref.custom_base)
|
||||
|
||||
//Any additional non-trait settings can be applied here
|
||||
new_S.blood_color = pref.blood_color
|
||||
|
||||
@@ -79,6 +79,8 @@
|
||||
return
|
||||
|
||||
var/new_size = input("Put the desired size (25-200%), or (1-600%) in dormitory areas.", "Set Size", 200) as num|null
|
||||
if(!new_size)
|
||||
return //cancelled
|
||||
|
||||
//Check AGAIN because we accepted user input which is blocking.
|
||||
if (src != H.w_uniform)
|
||||
@@ -88,9 +90,9 @@
|
||||
if (H.stat || H.restrained())
|
||||
return
|
||||
|
||||
if (isnull(H.size_multiplier))
|
||||
if (isnull(H.size_multiplier)) // Why would this ever be the case?
|
||||
to_chat(H,"<span class='warning'>The uniform panics and corrects your apparently microscopic size.</span>")
|
||||
H.resize(RESIZE_NORMAL)
|
||||
H.resize(RESIZE_NORMAL, ignore_prefs = TRUE)
|
||||
H.update_icons() //Just want the matrix transform
|
||||
return
|
||||
|
||||
@@ -102,7 +104,7 @@
|
||||
if(new_size != H.size_multiplier)
|
||||
if(!original_size)
|
||||
original_size = H.size_multiplier
|
||||
H.resize(new_size/100)
|
||||
H.resize(new_size/100, ignore_prefs = TRUE) // Ignores prefs because you can only resize yourself
|
||||
H.visible_message("<span class='warning'>The space around [H] distorts as they change size!</span>","<span class='notice'>The space around you distorts as you change size!</span>")
|
||||
else //They chose their current size.
|
||||
return
|
||||
@@ -111,7 +113,7 @@
|
||||
. = ..()
|
||||
if(. && ishuman(M) && original_size)
|
||||
var/mob/living/carbon/human/H = M
|
||||
H.resize(original_size)
|
||||
H.resize(original_size, ignore_prefs = TRUE)
|
||||
original_size = null
|
||||
H.visible_message("<span class='warning'>The space around [H] distorts as they return to their original size!</span>","<span class='notice'>The space around you distorts as you return to your original size!</span>")
|
||||
|
||||
|
||||
@@ -89,8 +89,8 @@
|
||||
vermstring = "lizards"
|
||||
if(VERM_SPIDERS)
|
||||
spawn_types = list(/obj/effect/spider/spiderling)
|
||||
min_number = 6 //CHOMP Add
|
||||
max_number = 12 //CHOMP edit
|
||||
min_number = 4 //CHOMP Add
|
||||
max_number = 8 //CHOMP edit
|
||||
vermstring = "spiders"
|
||||
|
||||
spawn(0)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
/datum/event/spider_infestation/setup()
|
||||
announceWhen = rand(announceWhen, announceWhen + 60)
|
||||
spawncount = rand(12 * severity, 18 * severity) //spiderlings only have a 50% chance to grow big and strong //CHOMP Edit: Tripled amount spawned
|
||||
spawncount = rand(6 * severity, 12 * severity) //spiderlings only have a 50% chance to grow big and strong //CHOMP Edit: Tripled amount spawned
|
||||
sent_spiders_to_station = 0
|
||||
|
||||
/datum/event/spider_infestation/announce()
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
var/datum/looping_sound/microwave/soundloop
|
||||
|
||||
|
||||
// see code/modules/food/recipes_microwave.dm for recipes
|
||||
//see code/modules/food/recipes_microwave.dm for recipes
|
||||
|
||||
/*******************
|
||||
* Initialising
|
||||
@@ -283,68 +283,69 @@
|
||||
if("dispose")
|
||||
dispose()
|
||||
return TRUE
|
||||
|
||||
// /obj/machinery/microwave/interact(mob/user as mob) // The microwave Menu
|
||||
// var/dat = ""
|
||||
// if(src.broken > 0)
|
||||
// dat = {"<TT>Bzzzzttttt</TT>"}
|
||||
// else if(src.operating)
|
||||
// dat = {"<TT>Microwaving in progress!<BR>Please wait...!</TT>"}
|
||||
// else if(src.dirty==100)
|
||||
// dat = {"<TT>This microwave is dirty!<BR>Please clean it before use!</TT>"}
|
||||
// else
|
||||
// var/list/items_counts = new
|
||||
// var/list/items_measures = new
|
||||
// var/list/items_measures_p = new
|
||||
// for (var/obj/O in ((contents - component_parts) - circuit))
|
||||
// var/display_name = O.name
|
||||
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
|
||||
// items_measures[display_name] = "egg"
|
||||
// items_measures_p[display_name] = "eggs"
|
||||
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
|
||||
// items_measures[display_name] = "tofu chunk"
|
||||
// items_measures_p[display_name] = "tofu chunks"
|
||||
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
|
||||
// items_measures[display_name] = "slab of meat"
|
||||
// items_measures_p[display_name] = "slabs of meat"
|
||||
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
|
||||
// display_name = "Turnovers"
|
||||
// items_measures[display_name] = "turnover"
|
||||
// items_measures_p[display_name] = "turnovers"
|
||||
// if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
|
||||
// items_measures[display_name] = "fillet of meat"
|
||||
// items_measures_p[display_name] = "fillets of meat"
|
||||
// items_counts[display_name]++
|
||||
// for (var/O in items_counts)
|
||||
// var/N = items_counts[O]
|
||||
// if (!(O in items_measures))
|
||||
// dat += {"<B>[capitalize(O)]:</B> [N] [lowertext(O)]\s<BR>"}
|
||||
// else
|
||||
// if (N==1)
|
||||
// dat += {"<B>[capitalize(O)]:</B> [N] [items_measures[O]]<BR>"}
|
||||
// else
|
||||
// dat += {"<B>[capitalize(O)]:</B> [N] [items_measures_p[O]]<BR>"}
|
||||
/*
|
||||
/obj/machinery/microwave/interact(mob/user as mob) // The microwave Menu
|
||||
var/dat = ""
|
||||
if(src.broken > 0)
|
||||
dat = {"<TT>Bzzzzttttt</TT>"}
|
||||
else if(src.operating)
|
||||
dat = {"<TT>Microwaving in progress!<BR>Please wait...!</TT>"}
|
||||
else if(src.dirty==100)
|
||||
dat = {"<TT>This microwave is dirty!<BR>Please clean it before use!</TT>"}
|
||||
else
|
||||
var/list/items_counts = new
|
||||
var/list/items_measures = new
|
||||
var/list/items_measures_p = new
|
||||
for (var/obj/O in ((contents - component_parts) - circuit))
|
||||
var/display_name = O.name
|
||||
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
|
||||
items_measures[display_name] = "egg"
|
||||
items_measures_p[display_name] = "eggs"
|
||||
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
|
||||
items_measures[display_name] = "tofu chunk"
|
||||
items_measures_p[display_name] = "tofu chunks"
|
||||
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
|
||||
items_measures[display_name] = "slab of meat"
|
||||
items_measures_p[display_name] = "slabs of meat"
|
||||
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
|
||||
display_name = "Turnovers"
|
||||
items_measures[display_name] = "turnover"
|
||||
items_measures_p[display_name] = "turnovers"
|
||||
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
|
||||
items_measures[display_name] = "fillet of meat"
|
||||
items_measures_p[display_name] = "fillets of meat"
|
||||
items_counts[display_name]++
|
||||
for (var/O in items_counts)
|
||||
var/N = items_counts[O]
|
||||
if (!(O in items_measures))
|
||||
dat += {"<B>[capitalize(O)]:</B> [N] [lowertext(O)]\s<BR>"}
|
||||
else
|
||||
if (N==1)
|
||||
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures[O]]<BR>"}
|
||||
else
|
||||
dat += {"<B>[capitalize(O)]:</B> [N] [items_measures_p[O]]<BR>"}
|
||||
|
||||
// for (var/datum/reagent/R in reagents.reagent_list)
|
||||
// var/display_name = R.name
|
||||
// if (R.id == "capsaicin")
|
||||
// display_name = "Hotsauce"
|
||||
// if (R.id == "frostoil")
|
||||
// display_name = "Coldsauce"
|
||||
// dat += {"<B>[display_name]:</B> [R.volume] unit\s<BR>"}
|
||||
for (var/datum/reagent/R in reagents.reagent_list)
|
||||
var/display_name = R.name
|
||||
if (R.id == "capsaicin")
|
||||
display_name = "Hotsauce"
|
||||
if (R.id == "frostoil")
|
||||
display_name = "Coldsauce"
|
||||
dat += {"<B>[display_name]:</B> [R.volume] unit\s<BR>"}
|
||||
|
||||
// if (items_counts.len==0 && reagents.reagent_list.len==0)
|
||||
// dat = {"<B>The microwave is empty</B><BR>"}
|
||||
// else
|
||||
// dat = {"<b>Ingredients:</b><br>[dat]"}
|
||||
// dat += {"<HR><BR>\
|
||||
// <A href='?src=\ref[src];action=cook'>Turn on!<BR>\
|
||||
// <A href='?src=\ref[src];action=dispose'>Eject ingredients!<BR>\
|
||||
// "}
|
||||
if (items_counts.len==0 && reagents.reagent_list.len==0)
|
||||
dat = {"<B>The microwave is empty</B><BR>"}
|
||||
else
|
||||
dat = {"<b>Ingredients:</b><br>[dat]"}
|
||||
dat += {"<HR><BR>\
|
||||
<A href='?src=\ref[src];action=cook'>Turn on!<BR>\
|
||||
<A href='?src=\ref[src];action=dispose'>Eject ingredients!<BR>\
|
||||
"}
|
||||
|
||||
// user << browse("<HEAD><TITLE>Microwave Controls</TITLE></HEAD><TT>[dat]</TT>", "window=microwave")
|
||||
// onclose(user, "microwave")
|
||||
// return
|
||||
user << browse("<HEAD><TITLE>Microwave Controls</TITLE></HEAD><TT>[dat]</TT>", "window=microwave")
|
||||
onclose(user, "microwave")
|
||||
return
|
||||
*/
|
||||
|
||||
/***********************************
|
||||
* Microwave Menu Handling/Cooking
|
||||
|
||||
@@ -53,9 +53,10 @@ var/list/name_to_material
|
||||
/proc/populate_material_list(force_remake=0)
|
||||
if(name_to_material && !force_remake) return // Already set up!
|
||||
name_to_material = list()
|
||||
for(var/type in typesof(/datum/material) - /datum/material)
|
||||
for(var/type in subtypesof(/datum/material))
|
||||
var/datum/material/new_mineral = new type
|
||||
if(!new_mineral.name)
|
||||
qdel(new_mineral)
|
||||
continue
|
||||
name_to_material[lowertext(new_mineral.name)] = new_mineral
|
||||
return 1
|
||||
|
||||
@@ -207,15 +207,6 @@
|
||||
|
||||
return FALSE
|
||||
|
||||
/mob/living/carbon/human/verb/toggle_resizing_immunity()
|
||||
set name = "Toggle Resizing Immunity"
|
||||
set desc = "Toggles your ability to resist resizing attempts"
|
||||
set category = "IC"
|
||||
|
||||
resizable = !resizable
|
||||
to_chat(src, "<span class='notice'>You are now [resizable ? "susceptible" : "immune"] to being resized.</span>")
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/handle_flip_vr()
|
||||
var/original_density = density
|
||||
var/original_passflags = pass_flags
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
if(istype(back, /obj/item/weapon/tank/jetpack))
|
||||
return back
|
||||
else if(istype(rig))
|
||||
for(var/obj/item/rig_module/maneuvering_jets.module in rig.installed_modules)
|
||||
for(var/obj/item/rig_module/maneuvering_jets/module in rig.installed_modules)
|
||||
return module.jets
|
||||
|
||||
/mob/living/carbon/human/Process_Spacemove(var/check_drift = 0)
|
||||
|
||||
@@ -42,32 +42,49 @@
|
||||
nif.nifsofts = nifsofts
|
||||
else
|
||||
..()
|
||||
/datum/species/proc/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H)
|
||||
ASSERT(to_copy)
|
||||
/datum/species/proc/produceCopy(var/list/traits,var/mob/living/carbon/human/H, var/custom_base)
|
||||
var/datum/species/S
|
||||
//If species allows custom base, and custom base is set, apply it, otherwise use default.
|
||||
if(selects_bodytype && custom_base)
|
||||
S = GLOB.all_species[custom_base]
|
||||
else
|
||||
S = GLOB.all_species[src.name]
|
||||
ASSERT(S)
|
||||
ASSERT(istype(H))
|
||||
var/datum/species/new_copy = new S.type()
|
||||
|
||||
if(ispath(to_copy))
|
||||
to_copy = "[initial(to_copy.name)]"
|
||||
if(istext(to_copy))
|
||||
to_copy = GLOB.all_species[to_copy]
|
||||
for(var/i in S.vars) //Thorough copy of species.
|
||||
if(new_copy.vars[i] != S.vars[i])
|
||||
//Skipping lists because they may contain more lists, copy those manually.
|
||||
//Also ignoring type var since it's read-only and will runtime.
|
||||
if(islist(vars[i]))
|
||||
continue
|
||||
new_copy.vars[i] = S.vars[i]
|
||||
|
||||
var/datum/species/new_copy = new to_copy.type()
|
||||
|
||||
for(var/organ in to_copy.has_limbs)
|
||||
var/list/organ_data = to_copy.has_limbs[organ]
|
||||
for(var/organ in S.has_limbs) //Copy important organ data generated by species.
|
||||
var/list/organ_data = S.has_limbs[organ]
|
||||
new_copy.has_limbs[organ] = organ_data.Copy()
|
||||
|
||||
new_copy.traits = traits
|
||||
|
||||
//If you had traits, apply them
|
||||
if(new_copy.traits)
|
||||
for(var/trait in new_copy.traits)
|
||||
var/datum/trait/T = all_traits[trait]
|
||||
T.apply(new_copy,H)
|
||||
T.apply(new_copy, H)
|
||||
|
||||
//Set up a mob
|
||||
H.species = new_copy
|
||||
H.icon_state = new_copy.get_bodytype()
|
||||
|
||||
if(new_copy.holder_type)
|
||||
H.holder_type = new_copy.holder_type
|
||||
|
||||
if(H.dna)
|
||||
H.dna.ready_dna(H)
|
||||
|
||||
return new_copy
|
||||
return new_copy
|
||||
|
||||
|
||||
/datum/species/get_bodytype()
|
||||
return base_species
|
||||
@@ -447,55 +447,6 @@
|
||||
|
||||
//End of fruit gland code.
|
||||
|
||||
/datum/species/alraune/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H)
|
||||
ASSERT(to_copy)
|
||||
ASSERT(istype(H))
|
||||
|
||||
if(ispath(to_copy))
|
||||
to_copy = "[initial(to_copy.name)]"
|
||||
if(istext(to_copy))
|
||||
to_copy = GLOB.all_species[to_copy]
|
||||
|
||||
var/datum/species/alraune/new_copy = new()
|
||||
|
||||
//Initials so it works with a simple path passed, or an instance
|
||||
new_copy.base_species = to_copy.name
|
||||
new_copy.icobase = to_copy.icobase
|
||||
new_copy.deform = to_copy.deform
|
||||
new_copy.tail = to_copy.tail
|
||||
new_copy.tail_animation = to_copy.tail_animation
|
||||
new_copy.icobase_tail = to_copy.icobase_tail
|
||||
new_copy.color_mult = to_copy.color_mult
|
||||
new_copy.primitive_form = to_copy.primitive_form
|
||||
new_copy.appearance_flags = to_copy.appearance_flags
|
||||
new_copy.flesh_color = to_copy.flesh_color
|
||||
new_copy.base_color = to_copy.base_color
|
||||
new_copy.blood_mask = to_copy.blood_mask
|
||||
new_copy.damage_mask = to_copy.damage_mask
|
||||
new_copy.damage_overlays = to_copy.damage_overlays
|
||||
new_copy.traits = traits
|
||||
|
||||
//If you had traits, apply them
|
||||
if(new_copy.traits)
|
||||
for(var/trait in new_copy.traits)
|
||||
var/datum/trait/T = all_traits[trait]
|
||||
T.apply(new_copy,H)
|
||||
|
||||
//Set up a mob
|
||||
H.species = new_copy
|
||||
H.icon_state = lowertext(new_copy.get_bodytype())
|
||||
|
||||
if(new_copy.holder_type)
|
||||
H.holder_type = new_copy.holder_type
|
||||
|
||||
if(H.dna)
|
||||
H.dna.ready_dna(H)
|
||||
|
||||
return new_copy
|
||||
|
||||
/datum/species/alraune/get_bodytype()
|
||||
return base_species
|
||||
|
||||
/datum/species/alraune/get_race_key()
|
||||
var/datum/species/real = GLOB.all_species[base_species]
|
||||
return real.race_key
|
||||
|
||||
@@ -45,61 +45,14 @@
|
||||
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right, "descriptor" = "right foot")
|
||||
)
|
||||
|
||||
/datum/species/custom/get_bodytype()
|
||||
return base_species
|
||||
|
||||
/datum/species/custom/get_race_key()
|
||||
var/datum/species/real = GLOB.all_species[base_species]
|
||||
return real.race_key
|
||||
|
||||
/datum/species/custom/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H)
|
||||
ASSERT(to_copy)
|
||||
ASSERT(istype(H))
|
||||
|
||||
if(ispath(to_copy))
|
||||
to_copy = "[initial(to_copy.name)]"
|
||||
if(istext(to_copy))
|
||||
to_copy = GLOB.all_species[to_copy]
|
||||
|
||||
var/datum/species/custom/new_copy = new()
|
||||
|
||||
//Initials so it works with a simple path passed, or an instance
|
||||
new_copy.base_species = to_copy.name
|
||||
new_copy.icobase = to_copy.icobase
|
||||
new_copy.deform = to_copy.deform
|
||||
new_copy.tail = to_copy.tail
|
||||
new_copy.tail_animation = to_copy.tail_animation
|
||||
new_copy.icobase_tail = to_copy.icobase_tail
|
||||
new_copy.color_mult = to_copy.color_mult
|
||||
new_copy.primitive_form = to_copy.primitive_form
|
||||
new_copy.appearance_flags = to_copy.appearance_flags
|
||||
new_copy.flesh_color = to_copy.flesh_color
|
||||
new_copy.base_color = to_copy.base_color
|
||||
new_copy.blood_mask = to_copy.blood_mask
|
||||
new_copy.damage_mask = to_copy.damage_mask
|
||||
new_copy.damage_overlays = to_copy.damage_overlays
|
||||
new_copy.traits = traits
|
||||
new_copy.move_trail = move_trail
|
||||
new_copy.has_floating_eyes = has_floating_eyes
|
||||
|
||||
//If you had traits, apply them
|
||||
if(new_copy.traits)
|
||||
for(var/trait in new_copy.traits)
|
||||
var/datum/trait/T = all_traits[trait]
|
||||
T.apply(new_copy,H)
|
||||
|
||||
//Set up a mob
|
||||
H.species = new_copy
|
||||
H.maxHealth = new_copy.total_health
|
||||
H.hunger_rate = new_copy.hunger_factor
|
||||
|
||||
if(new_copy.holder_type)
|
||||
H.holder_type = new_copy.holder_type
|
||||
|
||||
if(H.dna)
|
||||
H.dna.ready_dna(H)
|
||||
|
||||
return new_copy
|
||||
/datum/species/custom/produceCopy(var/list/traits,var/mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
H.maxHealth = H.species.total_health
|
||||
H.hunger_rate = H.species.hunger_factor
|
||||
|
||||
// Stub species overrides for shoving trait abilities into
|
||||
|
||||
|
||||
@@ -502,7 +502,7 @@ var/global/list/disallowed_protean_accessories = list(
|
||||
var/atom/reform_spot = blob.drop_location()
|
||||
|
||||
//Size update
|
||||
resize(blob.size_multiplier, FALSE)
|
||||
resize(blob.size_multiplier, FALSE, ignore_prefs = TRUE)
|
||||
|
||||
//Move them back where the blob was
|
||||
forceMove(reform_spot)
|
||||
|
||||
@@ -396,14 +396,14 @@
|
||||
//Sizing up
|
||||
if(cost > 0)
|
||||
if(refactory.use_stored_material(MAT_STEEL,cost))
|
||||
user.resize(size_factor)
|
||||
user.resize(size_factor, ignore_prefs = TRUE)
|
||||
else
|
||||
to_chat(user,"<span class='warning'>That size change would cost [cost] steel, which you don't have.</span>")
|
||||
//Sizing down (or not at all)
|
||||
else if(cost <= 0)
|
||||
cost = abs(cost)
|
||||
var/actually_added = refactory.add_stored_material(MAT_STEEL,cost)
|
||||
user.resize(size_factor)
|
||||
user.resize(size_factor, ignore_prefs = TRUE)
|
||||
if(actually_added != cost)
|
||||
to_chat(user,"<span class='warning'>Unfortunately, [cost-actually_added] steel was lost due to lack of storage space.</span>")
|
||||
|
||||
|
||||
@@ -294,56 +294,6 @@
|
||||
// HUD update time
|
||||
update_xenochimera_hud(H, danger, feral_state)
|
||||
|
||||
|
||||
/datum/species/xenochimera/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H)
|
||||
ASSERT(to_copy)
|
||||
ASSERT(istype(H))
|
||||
|
||||
if(ispath(to_copy))
|
||||
to_copy = "[initial(to_copy.name)]"
|
||||
if(istext(to_copy))
|
||||
to_copy = GLOB.all_species[to_copy]
|
||||
|
||||
var/datum/species/xenochimera/new_copy = new()
|
||||
|
||||
//Initials so it works with a simple path passed, or an instance
|
||||
new_copy.base_species = to_copy.name
|
||||
new_copy.icobase = to_copy.icobase
|
||||
new_copy.deform = to_copy.deform
|
||||
new_copy.tail = to_copy.tail
|
||||
new_copy.tail_animation = to_copy.tail_animation
|
||||
new_copy.icobase_tail = to_copy.icobase_tail
|
||||
new_copy.color_mult = to_copy.color_mult
|
||||
new_copy.primitive_form = to_copy.primitive_form
|
||||
new_copy.appearance_flags = to_copy.appearance_flags
|
||||
new_copy.flesh_color = to_copy.flesh_color
|
||||
new_copy.base_color = to_copy.base_color
|
||||
new_copy.blood_mask = to_copy.blood_mask
|
||||
new_copy.damage_mask = to_copy.damage_mask
|
||||
new_copy.damage_overlays = to_copy.damage_overlays
|
||||
new_copy.traits = traits
|
||||
|
||||
//If you had traits, apply them
|
||||
if(new_copy.traits)
|
||||
for(var/trait in new_copy.traits)
|
||||
var/datum/trait/T = all_traits[trait]
|
||||
T.apply(new_copy,H)
|
||||
|
||||
//Set up a mob
|
||||
H.species = new_copy
|
||||
H.icon_state = lowertext(new_copy.get_bodytype())
|
||||
|
||||
if(new_copy.holder_type)
|
||||
H.holder_type = new_copy.holder_type
|
||||
|
||||
if(H.dna)
|
||||
H.dna.ready_dna(H)
|
||||
|
||||
return new_copy
|
||||
|
||||
/datum/species/xenochimera/get_bodytype()
|
||||
return base_species
|
||||
|
||||
/datum/species/xenochimera/get_race_key()
|
||||
var/datum/species/real = GLOB.all_species[base_species]
|
||||
return real.race_key
|
||||
|
||||
@@ -5,9 +5,6 @@
|
||||
var/ooc_notes = null
|
||||
appearance_flags = TILE_BOUND|PIXEL_SCALE|KEEP_TOGETHER
|
||||
var/hunger_rate = DEFAULT_HUNGER_FACTOR
|
||||
var/resizable = TRUE
|
||||
var/size_uncapped = FALSE //Determines if a mob's size obedies the resize cap, used for adminbus resize.
|
||||
|
||||
//custom say verbs
|
||||
var/custom_say = null
|
||||
var/custom_ask = null
|
||||
@@ -17,4 +14,4 @@
|
||||
//YW Add Start
|
||||
/mob
|
||||
var/wingdings = 0
|
||||
//Yw Add End
|
||||
//Yw Add End
|
||||
@@ -88,9 +88,9 @@
|
||||
hitsound_wall = 'sound/weapons/effects/searwall.ogg'
|
||||
|
||||
|
||||
/* Close to mid-ranged shooter that arcs over other things, ideal if allies are in front of it.
|
||||
Difference from siege hivebots is that siege hivebots have limited charges for their attacks, are very long range, and
|
||||
the projectiles have an AoE component, where as backline hivebots do not. */
|
||||
// Close to mid-ranged shooter that arcs over other things, ideal if allies are in front of it.
|
||||
// Difference from siege hivebots is that siege hivebots have limited charges for their attacks, are very long range, and
|
||||
// the projectiles have an AoE component, where as backline hivebots do not.
|
||||
/mob/living/simple_mob/mechanical/hivebot/ranged_damage/backline
|
||||
name = "backline hivebot"
|
||||
desc = "A robot that can fire short-ranged projectiles over their allies."
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
|
||||
else if(ismob(target))
|
||||
var/mob/living/M = target
|
||||
resize(M.size_multiplier)
|
||||
resize(M.size_multiplier, ignore_prefs = TRUE)
|
||||
|
||||
//Morphed is weaker
|
||||
melee_damage_lower = melee_damage_disguised
|
||||
@@ -165,7 +165,7 @@
|
||||
maptext = null
|
||||
|
||||
size_multiplier = our_size_multiplier
|
||||
resize(size_multiplier)
|
||||
resize(size_multiplier, ignore_prefs = TRUE)
|
||||
|
||||
//Baseline stats
|
||||
melee_damage_lower = initial(melee_damage_lower)
|
||||
@@ -183,7 +183,7 @@
|
||||
/mob/living/simple_mob/vore/hostile/morph/will_show_tooltip()
|
||||
return (!morphed)
|
||||
|
||||
/mob/living/simple_mob/vore/hostile/morph/resize(var/new_size, var/animate = TRUE)
|
||||
/mob/living/simple_mob/vore/hostile/morph/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE)
|
||||
if(morphed && !ismob(form))
|
||||
return
|
||||
return ..()
|
||||
|
||||
@@ -728,3 +728,9 @@
|
||||
icon_state = "unathilongfrills"
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
body_parts = list(BP_HEAD)
|
||||
|
||||
/datum/sprite_accessory/marking/vr/thunderthighs
|
||||
name = "Boosted Thighs"
|
||||
icon_state = "thunderthighs"
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
body_parts = list(BP_L_LEG,BP_R_LEG)
|
||||
@@ -65,3 +65,20 @@
|
||||
icon_state = "sergwheat"
|
||||
extra_overlay = "sergwheat_markings"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/wolf/fatsynthwolf
|
||||
name = "Fat SynthWolf dual-color (Taur)"
|
||||
icon_state = "fatsynthwolf_s"
|
||||
extra_overlay = "fatsynthwolf_markings"
|
||||
extra_overlay2 = "fatsynthwolf_glow"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/lizard/fatsynthlizard
|
||||
name = "Fat SynthLizard dual-color (Taur)"
|
||||
icon_state = "fatsynthlizard_s"
|
||||
extra_overlay = "fatsynthlizard_markings"
|
||||
extra_overlay2 = "fatsynthlizard_glow"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/feline/fatsynthfeline
|
||||
name = "Fat SynthFeline dual-color (Taur)"
|
||||
icon_state = "fatsynthfeline_s"
|
||||
extra_overlay = "fatsynthfeline_markings"
|
||||
extra_overlay2 = "fatsynthfeline_glow"
|
||||
|
||||
@@ -192,7 +192,7 @@
|
||||
var/datum/preferences/B = O.client.prefs
|
||||
for(var/language in B.alternate_languages)
|
||||
O.add_language(language)
|
||||
O.resize(B.size_multiplier, animate = TRUE) //VOREStation Addition: add size prefs to borgs
|
||||
O.resize(B.size_multiplier, animate = TRUE, ignore_prefs = TRUE) //VOREStation Addition: add size prefs to borgs
|
||||
O.fuzzy = B.fuzzy //VOREStation Addition: add size prefs to borgs
|
||||
|
||||
callHook("borgify", list(O))
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
to_chat(nif.human,"<span class='notice'>The safety features of the NIF Program prevent you from choosing this size.</span>")
|
||||
return
|
||||
else
|
||||
if(nif.human.resize(new_size/100))
|
||||
if(nif.human.resize(new_size/100, uncapped=nif.human.has_large_resize_bounds(), ignore_prefs = TRUE))
|
||||
to_chat(nif.human,"<span class='notice'>You set the size to [new_size]%</span>")
|
||||
nif.human.visible_message("<span class='warning'>Swirling grey mist envelops [nif.human] as they change size!</span>","<span class='notice'>Swirling streams of nanites wrap around you as you change size!</span>")
|
||||
spawn(0)
|
||||
|
||||
+30
-35
@@ -216,15 +216,17 @@ var/datum/planet/sif/planet_sif = null
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/outside_snow
|
||||
indoor_sounds_type = /datum/looping_sound/weather/inside_snow
|
||||
|
||||
/*
|
||||
/datum/weather/sif/snow/process_effects()
|
||||
..()
|
||||
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
if(S.z in holder.our_planet.expected_z_levels)
|
||||
for(var/dir_checked in cardinal)
|
||||
var/turf/simulated/floor/T = get_step(S, dir_checked)
|
||||
if(istype(T))
|
||||
if(istype(T, /turf/simulated/floor/outdoors) && prob(33))
|
||||
T.chill()
|
||||
*/
|
||||
|
||||
/datum/weather/sif/blizzard
|
||||
name = "blizzard"
|
||||
@@ -249,15 +251,17 @@ var/datum/planet/sif/planet_sif = null
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
|
||||
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
|
||||
|
||||
/*
|
||||
/datum/weather/sif/blizzard/process_effects()
|
||||
..()
|
||||
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
if(S.z in holder.our_planet.expected_z_levels)
|
||||
for(var/dir_checked in cardinal)
|
||||
var/turf/simulated/floor/T = get_step(S, dir_checked)
|
||||
if(istype(T))
|
||||
if(istype(T, /turf/simulated/floor/outdoors) && prob(50))
|
||||
T.chill()
|
||||
*/
|
||||
|
||||
/datum/weather/sif/rain
|
||||
name = "rain"
|
||||
@@ -283,25 +287,21 @@ var/datum/planet/sif/planet_sif = null
|
||||
|
||||
/datum/weather/sif/rain/process_effects()
|
||||
..()
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
for(var/mob/living/L as anything in living_mob_list)
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to rain on them.
|
||||
|
||||
// If they have an open umbrella, it'll guard from rain
|
||||
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = L.get_inactive_hand()
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
|
||||
L.water_act(1)
|
||||
if(show_message)
|
||||
@@ -340,24 +340,21 @@ var/datum/planet/sif/planet_sif = null
|
||||
|
||||
/datum/weather/sif/storm/process_effects()
|
||||
..()
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
for(var/mob/living/L as anything in living_mob_list)
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to rain on them.
|
||||
|
||||
// If they have an open umbrella, it'll guard from rain
|
||||
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
|
||||
continue
|
||||
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
|
||||
continue
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = L.get_inactive_hand()
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
|
||||
continue
|
||||
|
||||
|
||||
L.water_act(2)
|
||||
@@ -401,20 +398,18 @@ var/datum/planet/sif/planet_sif = null
|
||||
|
||||
/datum/weather/sif/hail/process_effects()
|
||||
..()
|
||||
for(var/humie in human_mob_list)
|
||||
var/mob/living/carbon/human/H = humie
|
||||
for(var/mob/living/carbon/H as anything in human_mob_list)
|
||||
if(H.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to pelt them with ice.
|
||||
|
||||
// If they have an open umbrella, it'll guard from hail
|
||||
var/obj/item/weapon/melee/umbrella/U
|
||||
if(istype(H.get_active_hand(), /obj/item/weapon/melee/umbrella))
|
||||
U = H.get_active_hand()
|
||||
else if(istype(H.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = H.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = H.get_inactive_hand()
|
||||
if(U && U.open)
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>")
|
||||
continue
|
||||
|
||||
@@ -156,15 +156,17 @@ var/datum/planet/virgo3b_better/planet_virgo3b_better = null
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/outside_snow
|
||||
indoor_sounds_type = /datum/looping_sound/weather/inside_snow
|
||||
|
||||
/*
|
||||
/datum/weather/virgo3b_better/snow/process_effects()
|
||||
..()
|
||||
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
if(S.z in holder.our_planet.expected_z_levels)
|
||||
for(var/dir_checked in cardinal)
|
||||
var/turf/simulated/floor/T = get_step(S, dir_checked)
|
||||
if(istype(T))
|
||||
if(istype(T, /turf/simulated/floor/outdoors) && prob(33))
|
||||
T.chill()
|
||||
*/
|
||||
|
||||
/datum/weather/virgo3b_better/blizzard
|
||||
name = "blizzard"
|
||||
@@ -189,15 +191,17 @@ var/datum/planet/virgo3b_better/planet_virgo3b_better = null
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
|
||||
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
|
||||
|
||||
/*
|
||||
/datum/weather/virgo3b_better/blizzard/process_effects()
|
||||
..()
|
||||
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
if(S.z in holder.our_planet.expected_z_levels)
|
||||
for(var/dir_checked in cardinal)
|
||||
var/turf/simulated/floor/T = get_step(S, dir_checked)
|
||||
if(istype(T))
|
||||
if(istype(T, /turf/simulated/floor/outdoors) && prob(50))
|
||||
T.chill()
|
||||
*/
|
||||
|
||||
/datum/weather/virgo3b_better/rain
|
||||
name = "rain"
|
||||
@@ -220,25 +224,21 @@ var/datum/planet/virgo3b_better/planet_virgo3b_better = null
|
||||
|
||||
/datum/weather/virgo3b_better/rain/process_effects()
|
||||
..()
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
for(var/mob/living/L as anything in living_mob_list)
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to rain on them.
|
||||
|
||||
// If they have an open umbrella, it'll guard from rain
|
||||
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = L.get_inactive_hand()
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
|
||||
L.water_act(1)
|
||||
if(show_message)
|
||||
@@ -275,25 +275,21 @@ var/datum/planet/virgo3b_better/planet_virgo3b_better = null
|
||||
|
||||
/datum/weather/virgo3b_better/storm/process_effects()
|
||||
..()
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
for(var/mob/living/L as anything in living_mob_list)
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to rain on them.
|
||||
|
||||
// If they have an open umbrella, it'll guard from rain
|
||||
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
|
||||
continue
|
||||
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
|
||||
continue
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = L.get_inactive_hand()
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
|
||||
continue
|
||||
|
||||
|
||||
L.water_act(2)
|
||||
@@ -335,20 +331,18 @@ var/datum/planet/virgo3b_better/planet_virgo3b_better = null
|
||||
|
||||
/datum/weather/virgo3b_better/hail/process_effects()
|
||||
..()
|
||||
for(var/humie in human_mob_list)
|
||||
var/mob/living/carbon/human/H = humie
|
||||
for(var/mob/living/carbon/H as anything in human_mob_list)
|
||||
if(H.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to pelt them with ice.
|
||||
|
||||
// If they have an open umbrella, it'll guard from hail
|
||||
var/obj/item/weapon/melee/umbrella/U
|
||||
if(istype(H.get_active_hand(), /obj/item/weapon/melee/umbrella))
|
||||
U = H.get_active_hand()
|
||||
else if(istype(H.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = H.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = H.get_inactive_hand()
|
||||
if(U && U.open)
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>")
|
||||
continue
|
||||
|
||||
@@ -203,15 +203,17 @@ var/datum/planet/virgo3b/planet_virgo3b = null
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/outside_snow
|
||||
indoor_sounds_type = /datum/looping_sound/weather/inside_snow
|
||||
|
||||
/*
|
||||
/datum/weather/virgo3b/snow/process_effects()
|
||||
..()
|
||||
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
if(S.z in holder.our_planet.expected_z_levels)
|
||||
for(var/dir_checked in cardinal)
|
||||
var/turf/simulated/floor/T = get_step(S, dir_checked)
|
||||
if(istype(T))
|
||||
if(istype(T, /turf/simulated/floor/outdoors) && prob(33))
|
||||
T.chill()
|
||||
*/
|
||||
|
||||
/datum/weather/virgo3b/blizzard
|
||||
name = "blizzard"
|
||||
@@ -236,15 +238,17 @@ var/datum/planet/virgo3b/planet_virgo3b = null
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
|
||||
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
|
||||
|
||||
/*
|
||||
/datum/weather/virgo3b/blizzard/process_effects()
|
||||
..()
|
||||
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
if(S.z in holder.our_planet.expected_z_levels)
|
||||
for(var/dir_checked in cardinal)
|
||||
var/turf/simulated/floor/T = get_step(S, dir_checked)
|
||||
if(istype(T))
|
||||
if(istype(T, /turf/simulated/floor/outdoors) && prob(50))
|
||||
T.chill()
|
||||
*/
|
||||
|
||||
/datum/weather/virgo3b/rain
|
||||
name = "rain"
|
||||
@@ -270,25 +274,21 @@ var/datum/planet/virgo3b/planet_virgo3b = null
|
||||
|
||||
/datum/weather/virgo3b/rain/process_effects()
|
||||
..()
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
for(var/mob/living/L as anything in living_mob_list)
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to rain on them.
|
||||
|
||||
// If they have an open umbrella, it'll guard from rain
|
||||
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = L.get_inactive_hand()
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
|
||||
L.water_act(1)
|
||||
if(show_message)
|
||||
@@ -325,25 +325,21 @@ var/datum/planet/virgo3b/planet_virgo3b = null
|
||||
|
||||
/datum/weather/virgo3b/storm/process_effects()
|
||||
..()
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
for(var/mob/living/L as anything in living_mob_list)
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to rain on them.
|
||||
|
||||
// If they have an open umbrella, it'll guard from rain
|
||||
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
|
||||
continue
|
||||
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
|
||||
continue
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = L.get_inactive_hand()
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
|
||||
|
||||
L.water_act(2)
|
||||
@@ -385,20 +381,18 @@ var/datum/planet/virgo3b/planet_virgo3b = null
|
||||
|
||||
/datum/weather/virgo3b/hail/process_effects()
|
||||
..()
|
||||
for(var/humie in human_mob_list)
|
||||
var/mob/living/carbon/human/H = humie
|
||||
for(var/mob/living/carbon/H as anything in human_mob_list)
|
||||
if(H.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to pelt them with ice.
|
||||
|
||||
// If they have an open umbrella, it'll guard from hail
|
||||
var/obj/item/weapon/melee/umbrella/U
|
||||
if(istype(H.get_active_hand(), /obj/item/weapon/melee/umbrella))
|
||||
U = H.get_active_hand()
|
||||
else if(istype(H.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = H.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = H.get_inactive_hand()
|
||||
if(U && U.open)
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>")
|
||||
continue
|
||||
|
||||
@@ -187,15 +187,17 @@ var/datum/planet/virgo4/planet_virgo4 = null
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/outside_snow
|
||||
indoor_sounds_type = /datum/looping_sound/weather/inside_snow
|
||||
|
||||
/*
|
||||
/datum/weather/virgo4/snow/process_effects()
|
||||
..()
|
||||
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
if(S.z in holder.our_planet.expected_z_levels)
|
||||
for(var/dir_checked in cardinal)
|
||||
var/turf/simulated/floor/T = get_step(S, dir_checked)
|
||||
if(istype(T))
|
||||
if(istype(T, /turf/simulated/floor/outdoors) && prob(33))
|
||||
T.chill()
|
||||
*/
|
||||
|
||||
/datum/weather/virgo4/blizzard
|
||||
name = "blizzard"
|
||||
@@ -217,15 +219,17 @@ var/datum/planet/virgo4/planet_virgo4 = null
|
||||
outdoor_sounds_type = /datum/looping_sound/weather/outside_blizzard
|
||||
indoor_sounds_type = /datum/looping_sound/weather/inside_blizzard
|
||||
|
||||
/*
|
||||
/datum/weather/virgo4/blizzard/process_effects()
|
||||
..()
|
||||
for(var/turf/simulated/floor/outdoors/snow/S in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
for(var/turf/simulated/floor/outdoors/snow/S as anything in SSplanets.new_outdoor_turfs) //This didn't make any sense before SSplanets, either
|
||||
if(S.z in holder.our_planet.expected_z_levels)
|
||||
for(var/dir_checked in cardinal)
|
||||
var/turf/simulated/floor/T = get_step(S, dir_checked)
|
||||
if(istype(T))
|
||||
if(istype(T, /turf/simulated/floor/outdoors) && prob(50))
|
||||
T.chill()
|
||||
*/
|
||||
|
||||
/datum/weather/virgo4/rain
|
||||
name = "rain"
|
||||
@@ -248,25 +252,21 @@ var/datum/planet/virgo4/planet_virgo4 = null
|
||||
|
||||
/datum/weather/virgo4/rain/process_effects()
|
||||
..()
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
for(var/mob/living/L as anything in living_mob_list)
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to rain on them.
|
||||
|
||||
// If they have an open umbrella, it'll guard from rain
|
||||
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = L.get_inactive_hand()
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain patters softly onto your umbrella.</span>")
|
||||
continue
|
||||
|
||||
L.water_act(1)
|
||||
if(show_message)
|
||||
@@ -298,25 +298,21 @@ var/datum/planet/virgo4/planet_virgo4 = null
|
||||
|
||||
/datum/weather/virgo4/storm/process_effects()
|
||||
..()
|
||||
for(var/mob/living/L in living_mob_list)
|
||||
for(var/mob/living/L as anything in living_mob_list)
|
||||
if(L.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(L)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to rain on them.
|
||||
|
||||
// If they have an open umbrella, it'll guard from rain
|
||||
if(istype(L.get_active_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
|
||||
continue
|
||||
else if(istype(L.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_inactive_hand()
|
||||
if(U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
|
||||
continue
|
||||
var/obj/item/weapon/melee/umbrella/U = L.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = L.get_inactive_hand()
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(L, "<span class='notice'>Rain showers loudly onto your umbrella!</span>")
|
||||
continue
|
||||
|
||||
|
||||
L.water_act(2)
|
||||
@@ -355,20 +351,18 @@ var/datum/planet/virgo4/planet_virgo4 = null
|
||||
|
||||
/datum/weather/virgo4/hail/process_effects()
|
||||
..()
|
||||
for(var/humie in human_mob_list)
|
||||
var/mob/living/carbon/human/H = humie
|
||||
for(var/mob/living/carbon/H as anything in human_mob_list)
|
||||
if(H.z in holder.our_planet.expected_z_levels)
|
||||
var/turf/T = get_turf(H)
|
||||
if(!T.outdoors)
|
||||
continue // They're indoors, so no need to pelt them with ice.
|
||||
|
||||
// If they have an open umbrella, it'll guard from hail
|
||||
var/obj/item/weapon/melee/umbrella/U
|
||||
if(istype(H.get_active_hand(), /obj/item/weapon/melee/umbrella))
|
||||
U = H.get_active_hand()
|
||||
else if(istype(H.get_inactive_hand(), /obj/item/weapon/melee/umbrella))
|
||||
var/obj/item/weapon/melee/umbrella/U = H.get_active_hand()
|
||||
if(!istype(U) || !U.open)
|
||||
U = H.get_inactive_hand()
|
||||
if(U && U.open)
|
||||
|
||||
if(istype(U) && U.open)
|
||||
if(show_message)
|
||||
to_chat(H, "<span class='notice'>Hail patters onto your umbrella.</span>")
|
||||
continue
|
||||
|
||||
@@ -13,8 +13,7 @@
|
||||
mrate_static = TRUE
|
||||
|
||||
/datum/reagent/macrocillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(M.size_range_check(M.size_multiplier))
|
||||
M.resize(M.size_multiplier+0.01, FALSE)//Incrrease 1% per tick. //CHOMP Edit: don't do fancy animates. Unnecessary on 1% changes. Laggy.
|
||||
M.resize(M.size_multiplier+0.01, animate = FALSE, uncapped = M.has_large_resize_bounds()) //Incrrease 1% per tick. //CHOMP Edit: don't do fancy animates. Unnecessary on 1% changes. Laggy.
|
||||
return
|
||||
|
||||
/datum/reagent/microcillin
|
||||
@@ -27,8 +26,7 @@
|
||||
mrate_static = TRUE
|
||||
|
||||
/datum/reagent/microcillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
|
||||
if(M.size_range_check(M.size_multiplier))
|
||||
M.resize(M.size_multiplier-0.01, FALSE) //Decrease 1% per tick. //CHOMP Edit: don't do fancy animates. Unnecessary on 1% changes. Laggy.
|
||||
M.resize(M.size_multiplier-0.01, animate = FALSE, uncapped = M.has_large_resize_bounds()) //Decrease 1% per tick. //CHOMP Edit: don't do fancy animates. Unnecessary on 1% changes. Laggy.
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -426,20 +426,3 @@
|
||||
user.visible_message("<span class='warning'>[user]'s hand slips, damaging [target]'s [affected.name] with \the [tool]!</span>", \
|
||||
"<span class='warning'>Your hand slips, damaging [target]'s [affected.name] with \the [tool]!</span>")
|
||||
affected.createwound(BRUISE, 20)
|
||||
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// HEART SURGERY //
|
||||
//////////////////////////////////////////////////////////////////
|
||||
// To be finished after some tests.
|
||||
/* /datum/surgery_step/ribcage/heart/cut
|
||||
allowed_tools = list(
|
||||
/obj/item/weapon/surgical/scalpel = 100,
|
||||
/obj/item/weapon/material/knife = 75,
|
||||
/obj/item/weapon/material/shard = 50,
|
||||
)
|
||||
|
||||
min_duration = 30
|
||||
max_duration = 40
|
||||
|
||||
/datum/surgery_step/ribcage/heart/cut/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool)
|
||||
return ..() && target.op_stage.ribcage == 2 */
|
||||
@@ -3,7 +3,8 @@
|
||||
var/digestable = TRUE // Can the mob be digested inside a belly?
|
||||
var/devourable = TRUE // Can the mob be devoured at all?
|
||||
var/feeding = TRUE // Can the mob be vorishly force fed or fed to others?
|
||||
var/absorbable = TRUE // Are you allowed to absorb this person? TFF addition 14/12/19
|
||||
var/absorbable = TRUE // Are you allowed to absorb this person?
|
||||
var/resizable = TRUE // Can other people resize you? (Usually ignored for self-resizes)
|
||||
var/digest_leave_remains = FALSE // Will this mob leave bones/skull/etc after the melty demise?
|
||||
var/allowmobvore = TRUE // Will simplemobs attempt to eat the mob?
|
||||
var/showvoreprefs = TRUE // Determines if the mechanical vore preferences button will be displayed on the mob or not.
|
||||
@@ -228,7 +229,8 @@
|
||||
P.digestable = src.digestable
|
||||
P.devourable = src.devourable
|
||||
P.feeding = src.feeding
|
||||
P.absorbable = src.absorbable //TFF 14/12/19 - choose whether allowing absorbing
|
||||
P.absorbable = src.absorbable
|
||||
P.resizable = src.resizable
|
||||
P.digest_leave_remains = src.digest_leave_remains
|
||||
P.allowmobvore = src.allowmobvore
|
||||
P.vore_taste = src.vore_taste
|
||||
@@ -269,7 +271,8 @@
|
||||
digestable = P.digestable
|
||||
devourable = P.devourable
|
||||
feeding = P.feeding
|
||||
absorbable = P.absorbable //TFF 14/12/19 - choose whether allowing absorbing
|
||||
absorbable = P.absorbable
|
||||
resizable = P.resizable
|
||||
digest_leave_remains = P.digest_leave_remains
|
||||
allowmobvore = P.allowmobvore
|
||||
vore_taste = P.vore_taste
|
||||
|
||||
@@ -45,26 +45,28 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
//Actual preferences
|
||||
var/digestable = TRUE
|
||||
var/devourable = TRUE
|
||||
var/absorbable = TRUE
|
||||
var/feeding = TRUE
|
||||
var/absorbable = TRUE //TFF 14/12/19 - choose whether allowing absorbing
|
||||
var/digest_leave_remains = FALSE
|
||||
var/allowmobvore = TRUE
|
||||
var/list/belly_prefs = list()
|
||||
var/vore_taste = "nothing in particular"
|
||||
var/vore_smell = "nothing in particular"
|
||||
var/permit_healbelly = TRUE
|
||||
var/show_vore_fx = TRUE
|
||||
var/can_be_drop_prey = FALSE
|
||||
var/can_be_drop_pred = FALSE
|
||||
var/digest_leave_remains = FALSE
|
||||
var/allowmobvore = TRUE
|
||||
var/permit_healbelly = TRUE
|
||||
|
||||
var/resizable = TRUE
|
||||
var/show_vore_fx = TRUE
|
||||
var/step_mechanics_pref = FALSE
|
||||
var/pickup_pref = TRUE
|
||||
|
||||
|
||||
//CHOMP stuff
|
||||
var/receive_reagents = FALSE
|
||||
var/give_reagents = FALSE
|
||||
var/latejoin_vore = FALSE
|
||||
//CHOMP stuff end
|
||||
|
||||
var/list/belly_prefs = list()
|
||||
var/vore_taste = "nothing in particular"
|
||||
var/vore_smell = "nothing in particular"
|
||||
|
||||
//Mechanically required
|
||||
var/path
|
||||
@@ -129,8 +131,9 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
|
||||
digestable = json_from_file["digestable"]
|
||||
devourable = json_from_file["devourable"]
|
||||
resizable = json_from_file["resizable"]
|
||||
feeding = json_from_file["feeding"]
|
||||
absorbable = json_from_file["absorbable"] //TFF 14/12/19 - choose whether allowing absorbing
|
||||
absorbable = json_from_file["absorbable"]
|
||||
digest_leave_remains = json_from_file["digest_leave_remains"]
|
||||
allowmobvore = json_from_file["allowmobvore"]
|
||||
vore_taste = json_from_file["vore_taste"]
|
||||
@@ -155,6 +158,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
digestable = TRUE
|
||||
if(isnull(devourable))
|
||||
devourable = TRUE
|
||||
if(isnull(resizable))
|
||||
resizable = TRUE
|
||||
if(isnull(feeding))
|
||||
feeding = TRUE
|
||||
if(isnull(absorbable))
|
||||
@@ -197,6 +202,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
"version" = version,
|
||||
"digestable" = digestable,
|
||||
"devourable" = devourable,
|
||||
"resizable" = resizable,
|
||||
"absorbable" = absorbable,
|
||||
"feeding" = feeding,
|
||||
"digest_leave_remains" = digest_leave_remains,
|
||||
|
||||
@@ -254,6 +254,7 @@
|
||||
data["prefs"] = list(
|
||||
"digestable" = host.digestable,
|
||||
"devourable" = host.devourable,
|
||||
"resizable" = host.resizable,
|
||||
"feeding" = host.feeding,
|
||||
"absorbable" = host.absorbable,
|
||||
"digest_leave_remains" = host.digest_leave_remains,
|
||||
@@ -415,6 +416,12 @@
|
||||
host.client.prefs_vr.devourable = host.devourable
|
||||
unsaved_changes = TRUE
|
||||
return TRUE
|
||||
if("toggle_resize")
|
||||
host.resizable = !host.resizable
|
||||
if(host.client.prefs_vr)
|
||||
host.client.prefs_vr.resizable = host.resizable
|
||||
unsaved_changes = TRUE
|
||||
return TRUE
|
||||
if("toggle_feed")
|
||||
host.feeding = !host.feeding
|
||||
if(host.client.prefs_vr)
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
GLOBAL_LIST_EMPTY(size_uncapped_mobs)
|
||||
GLOBAL_VAR(size_uncapped_mobs_timer)
|
||||
|
||||
// Adding needed defines to /mob/living
|
||||
// Note: Polaris had this on /mob/living/carbon/human We need it higher up for animals and stuff.
|
||||
/mob/living
|
||||
@@ -49,57 +46,40 @@ GLOBAL_VAR(size_uncapped_mobs_timer)
|
||||
/mob/living/get_effective_size()
|
||||
return size_multiplier
|
||||
|
||||
/**
|
||||
* Resizes the mob immediately to the desired mod, animating it growing/shrinking.
|
||||
* It can be used by anything that calls it.
|
||||
*/
|
||||
|
||||
/atom/movable/proc/size_range_check(size_select) //both objects and mobs needs to have that
|
||||
var/area/A = get_area(src) //Get the atom's area to check for size limit.
|
||||
if((A.limit_mob_size && (size_select > 200 || size_select < 25)) || (size_select > 600 || size_select <1))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/proc/add_to_uncapped_list(var/mob/living/L)
|
||||
if(L.size_uncapped)
|
||||
return
|
||||
if(!GLOB.size_uncapped_mobs.len)
|
||||
GLOB.size_uncapped_mobs_timer = addtimer(CALLBACK(GLOBAL_PROC, .check_uncapped_list), 2 SECONDS, TIMER_LOOP | TIMER_UNIQUE | TIMER_STOPPABLE)
|
||||
GLOB.size_uncapped_mobs |= weakref(L)
|
||||
/atom/movable/proc/has_large_resize_bounds()
|
||||
var/area/A = get_area(src) //Get the atom's area to check for size limit.
|
||||
return !A.limit_mob_size
|
||||
|
||||
/proc/remove_from_uncapped_list(var/mob/living/L)
|
||||
if(!GLOB.size_uncapped_mobs.len)
|
||||
return
|
||||
/proc/is_extreme_size(size)
|
||||
return (size < RESIZE_MINIMUM || size > RESIZE_MAXIMUM)
|
||||
|
||||
GLOB.size_uncapped_mobs -= weakref(L)
|
||||
|
||||
if(!GLOB.size_uncapped_mobs.len)
|
||||
deltimer(GLOB.size_uncapped_mobs_timer)
|
||||
GLOB.size_uncapped_mobs_timer = null
|
||||
/**
|
||||
* Resizes the mob immediately to the desired mod, animating it growing/shrinking.
|
||||
* It can be used by anything that calls it.
|
||||
*/
|
||||
|
||||
/proc/check_uncapped_list()
|
||||
for(var/weakref/wr in GLOB.size_uncapped_mobs)
|
||||
var/mob/living/L = wr.resolve()
|
||||
var/area/A = get_area(L)
|
||||
if(!istype(L))
|
||||
GLOB.size_uncapped_mobs -= wr
|
||||
continue
|
||||
|
||||
if((A.limit_mob_size && !L.size_uncapped) && (L.size_multiplier <= RESIZE_TINY || L.size_multiplier >= RESIZE_HUGE))
|
||||
L.resize(L.size_multiplier)
|
||||
GLOB.size_uncapped_mobs -= wr
|
||||
|
||||
if(!GLOB.size_uncapped_mobs.len)
|
||||
deltimer(GLOB.size_uncapped_mobs_timer)
|
||||
GLOB.size_uncapped_mobs_timer = null
|
||||
|
||||
/mob/living/proc/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE)
|
||||
/mob/living/proc/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE)
|
||||
if(!uncapped)
|
||||
new_size = clamp(new_size, RESIZE_TINY, RESIZE_HUGE)
|
||||
src.size_uncapped = FALSE
|
||||
remove_from_uncapped_list(src)
|
||||
else
|
||||
add_to_uncapped_list(src)
|
||||
new_size = clamp(new_size, RESIZE_MINIMUM, RESIZE_MAXIMUM)
|
||||
var/datum/component/resize_guard/guard = GetComponent(/datum/component/resize_guard)
|
||||
if(guard)
|
||||
qdel(guard)
|
||||
else if(has_large_resize_bounds())
|
||||
if(is_extreme_size(new_size))
|
||||
AddComponent(/datum/component/resize_guard)
|
||||
else
|
||||
var/datum/component/resize_guard/guard = GetComponent(/datum/component/resize_guard)
|
||||
if(guard)
|
||||
qdel(guard)
|
||||
|
||||
if(size_multiplier == new_size)
|
||||
return 1
|
||||
|
||||
@@ -130,8 +110,8 @@ GLOBAL_VAR(size_uncapped_mobs_timer)
|
||||
else
|
||||
update_transform() //Lame way
|
||||
|
||||
/mob/living/carbon/human/resize(var/new_size, var/animate = TRUE)
|
||||
if(!resizable)
|
||||
/mob/living/carbon/human/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE)
|
||||
if(!resizable && !ignore_prefs)
|
||||
return 1
|
||||
if(species)
|
||||
vis_height = species.icon_height
|
||||
@@ -144,7 +124,7 @@ GLOBAL_VAR(size_uncapped_mobs_timer)
|
||||
apply_hud(index, HI)
|
||||
|
||||
// Optimize mannequins - never a point to animating or doing HUDs on these.
|
||||
/mob/living/carbon/human/dummy/mannequin/resize(var/new_size, var/animate = TRUE)
|
||||
/mob/living/carbon/human/dummy/mannequin/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE)
|
||||
size_multiplier = new_size
|
||||
|
||||
/**
|
||||
|
||||
@@ -44,12 +44,15 @@
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
var/size_select = input("Put the desired size (25-200%), (1-600%) in dormitory areas.", "Set Size", size_set_to * 100) as num
|
||||
if(!size_range_check(size_select))
|
||||
to_chat(usr, "<span class='notice'>Invalid size.</span>")
|
||||
return
|
||||
size_set_to = (size_select/100)
|
||||
var/size_select = input("Put the desired size (25-200%), (1-600%) in dormitory areas.", "Set Size", size_set_to * 100) as num|null
|
||||
if(!size_select)
|
||||
return //cancelled
|
||||
//We do valid resize testing in actual firings because people move after setting these things.
|
||||
//Just a basic clamp here to the valid ranges.
|
||||
size_set_to = clamp((size_select/100), RESIZE_MINIMUM_DORMS, RESIZE_MAXIMUM_DORMS)
|
||||
to_chat(usr, "<span class='notice'>You set the size to [size_select]%</span>")
|
||||
if(size_set_to < RESIZE_MINIMUM || size_set_to > RESIZE_MAXIMUM)
|
||||
to_chat(usr, "<span class='notice'>Note: Resizing limited to 25-200% automatically while outside dormatory areas.</span>") //hint that we clamp it in resize
|
||||
|
||||
/obj/item/weapon/gun/energy/sizegun/examine(mob/user)
|
||||
. = ..()
|
||||
@@ -66,8 +69,10 @@
|
||||
set category = "Object"
|
||||
set src in view(1)
|
||||
|
||||
var/size_select = input("Put the desired size", "Set Size", size_set_to * 100) as num
|
||||
size_set_to = max(1,size_select/100) //No negative numbers
|
||||
var/size_select = input("Put the desired size (1-600%)", "Set Size", size_set_to * 100) as num|null
|
||||
if(!size_select)
|
||||
return //cancelled
|
||||
size_set_to = clamp((size_select/100), 0, 1000) //eheh
|
||||
to_chat(usr, "<span class='notice'>You set the size to [size_select]%</span>")
|
||||
|
||||
//
|
||||
@@ -88,8 +93,10 @@
|
||||
|
||||
/obj/item/projectile/beam/sizelaser/on_hit(var/atom/target)
|
||||
var/mob/living/M = target
|
||||
var/ignoring_prefs = (target == firer ? TRUE : FALSE) // Resizing yourself
|
||||
|
||||
if(istype(M))
|
||||
if(!M.resize(set_size))
|
||||
if(!M.resize(set_size, uncapped = M.has_large_resize_bounds(), ignore_prefs = ignoring_prefs))
|
||||
to_chat(M, "<font color='blue'>The beam fires into your body, changing your size!</font>")
|
||||
M.updateicon()
|
||||
return
|
||||
@@ -97,11 +104,19 @@
|
||||
|
||||
/obj/item/projectile/beam/sizelaser/admin/on_hit(var/atom/target)
|
||||
var/mob/living/M = target
|
||||
|
||||
if(istype(M))
|
||||
M.resize(set_size, TRUE, TRUE)
|
||||
if(set_size >= RESIZE_TINY && set_size <= RESIZE_HUGE)
|
||||
M.size_uncapped = FALSE
|
||||
M.size_uncapped = TRUE
|
||||
|
||||
var/can_be_big = M.has_large_resize_bounds()
|
||||
var/very_big = is_extreme_size(set_size)
|
||||
|
||||
if(very_big && can_be_big) // made an extreme size in an area that allows it, don't assume adminbuse
|
||||
to_chat(firer, "<span class='warning'>[M] will lose this size upon moving into an area where this size is not allowed.</span>")
|
||||
else if(very_big) // made an extreme size in an area that doesn't allow it, assume adminbuse
|
||||
to_chat(firer, "<span class='warning'>[M] will retain this normally unallowed size outside this area.</span>")
|
||||
|
||||
M.resize(set_size, uncapped = TRUE, ignore_prefs = TRUE) // Always ignores prefs, caution is advisable
|
||||
|
||||
to_chat(M, "<font color='blue'>The beam fires into your body, changing your size!</font>")
|
||||
M.updateicon()
|
||||
return
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 81 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 71 KiB |
@@ -908,6 +908,7 @@ const VoreUserPreferences = (props, context) => {
|
||||
const {
|
||||
digestable,
|
||||
devourable,
|
||||
resizable,
|
||||
feeding,
|
||||
absorbable,
|
||||
digest_leave_remains,
|
||||
@@ -1055,6 +1056,44 @@ const VoreUserPreferences = (props, context) => {
|
||||
: "Click here to turn on hunger noises.")}
|
||||
content={noisy ? "Hunger Noises Enabled" : "Hunger Noises Disabled"} />
|
||||
</Flex.Item>
|
||||
<Flex.Item basis="32%">
|
||||
<Button
|
||||
onClick={() => act("toggle_resize")}
|
||||
icon={resizable ? "toggle-on" : "toggle-off"}
|
||||
selected={resizable}
|
||||
fluid
|
||||
tooltip={"This button is to toggle your ability to be resized by others. "
|
||||
+ (resizable ? "Click here to prevent being resized." : "Click here to allow being resized.")}
|
||||
content={resizable ? "Resizing Allowed" : "No Resizing"} />
|
||||
</Flex.Item>
|
||||
<Flex.Item basis="32%" grow={1}>
|
||||
<Button
|
||||
onClick={() => act("toggle_steppref")}
|
||||
icon={step_mechanics_active ? "toggle-on" : "toggle-off"}
|
||||
selected={step_mechanics_active}
|
||||
fluid
|
||||
tooltipPosition="top"
|
||||
tooltip={step_mechanics_active
|
||||
? "This setting controls whether or not you participate in size-based step mechanics."
|
||||
+ "Includes both stepping on others, as well as getting stepped on. Click to disable step mechanics."
|
||||
: ("You will not participate in step mechanics."
|
||||
+ " Click to enable step mechanics.")}
|
||||
content={step_mechanics_active ? "Step Mechanics Enabled" : "Step Mechanics Disabled"} />
|
||||
</Flex.Item>
|
||||
<Flex.Item basis="32%">
|
||||
<Button
|
||||
onClick={() => act("toggle_fx")}
|
||||
icon={show_vore_fx ? "toggle-on" : "toggle-off"}
|
||||
selected={show_vore_fx}
|
||||
fluid
|
||||
tooltipPosition="top"
|
||||
tooltip={show_vore_fx
|
||||
? "This setting controls whether or not a pred is allowed to mess with your HUD and fullscreen overlays."
|
||||
+ "Click to disable all FX."
|
||||
: ("Regardless of Predator Setting, you will not see their FX settings."
|
||||
+ " Click this to enable showing FX.")}
|
||||
content={show_vore_fx ? "Show Vore FX" : "Do Not Show Vore FX"} />
|
||||
</Flex.Item>
|
||||
<Flex.Item basis="49%">
|
||||
<Button
|
||||
onClick={() => act("toggle_leaveremains")}
|
||||
@@ -1069,20 +1108,6 @@ const VoreUserPreferences = (props, context) => {
|
||||
+ " Click this to allow leaving remains.")}
|
||||
content={digest_leave_remains ? "Allow Leaving Remains Behind" : "Do Not Allow Leaving Remains Behind"} />
|
||||
</Flex.Item>
|
||||
<Flex.Item basis="49%">
|
||||
<Button
|
||||
onClick={() => act("toggle_steppref")}
|
||||
icon={step_mechanics_active ? "toggle-on" : "toggle-off"}
|
||||
selected={step_mechanics_active}
|
||||
fluid
|
||||
tooltipPosition="top"
|
||||
tooltip={step_mechanics_active
|
||||
? "This setting controls whether or not you participate in size-based step mechanics."
|
||||
+ "Includes both stepping on others, as well as getting stepped on. Click to disable step mechanics."
|
||||
: ("You will not participate in step mechanics."
|
||||
+ " Click to enable step mechanics.")}
|
||||
content={step_mechanics_active ? "Step Mechanics Enabled" : "Step Mechanics Disabled"} />
|
||||
</Flex.Item>
|
||||
<Flex.Item basis="49%">
|
||||
<Button
|
||||
onClick={() => act("toggle_pickuppref")}
|
||||
@@ -1097,20 +1122,6 @@ const VoreUserPreferences = (props, context) => {
|
||||
+ " Click this to allow picking up/being picked up.")}
|
||||
content={pickup_mechanics_active ? "Pick-up Mechanics Enabled" : "Pick-up Mechanics Disabled"} />
|
||||
</Flex.Item>
|
||||
<Flex.Item basis="49%">
|
||||
<Button
|
||||
onClick={() => act("toggle_fx")}
|
||||
icon={show_vore_fx ? "toggle-on" : "toggle-off"}
|
||||
selected={show_vore_fx}
|
||||
fluid
|
||||
tooltipPosition="top"
|
||||
tooltip={show_vore_fx
|
||||
? "This setting controls whether or not a pred is allowed to mess with your HUD and fullscreen overlays."
|
||||
+ "Click to disable all FX."
|
||||
: ("Regardless of Predator Setting, you will not see their FX settings."
|
||||
+ " Click this to enable showing FX.")}
|
||||
content={show_vore_fx ? "Show Vore FX" : "Do Not Show Vore FX"} />
|
||||
</Flex.Item>
|
||||
<Flex.Item basis="49%">
|
||||
<Button
|
||||
fluid
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -353,6 +353,7 @@
|
||||
#include "code\datums\autolathe\tools.dm"
|
||||
#include "code\datums\autolathe\tools_vr.dm"
|
||||
#include "code\datums\components\_component.dm"
|
||||
#include "code\datums\components\resize_guard.dm"
|
||||
#include "code\datums\elements\_element.dm"
|
||||
#include "code\datums\game_masters\_common.dm"
|
||||
#include "code\datums\helper_datums\construction_datum.dm"
|
||||
|
||||
Reference in New Issue
Block a user