mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-12 11:13:16 +00:00
Merge branch 'master' into OvermapDynamicPOIs
This commit is contained in:
5
modular_chomp/code/coalesce_ch.dm
Normal file
5
modular_chomp/code/coalesce_ch.dm
Normal file
@@ -0,0 +1,5 @@
|
||||
/proc/coalesce(...)
|
||||
for (var/arg in args)
|
||||
if (arg)
|
||||
return arg
|
||||
return null
|
||||
95
modular_chomp/code/datums/components/gargoyle.dm
Normal file
95
modular_chomp/code/datums/components/gargoyle.dm
Normal file
@@ -0,0 +1,95 @@
|
||||
/datum/component/gargoyle
|
||||
var/energy = 100
|
||||
var/transformed = FALSE
|
||||
var/paused = FALSE
|
||||
var/paused_loc
|
||||
var/cooldown
|
||||
|
||||
var/mob/living/carbon/human/gargoyle //easy reference
|
||||
var/obj/structure/gargoyle/statue //another easy ref
|
||||
|
||||
/datum/component/gargoyle/Initialize()
|
||||
if (!ishuman(parent))
|
||||
return COMPONENT_INCOMPATIBLE
|
||||
gargoyle = parent
|
||||
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_transformation
|
||||
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_pause
|
||||
gargoyle.verbs += /mob/living/carbon/human/proc/gargoyle_checkenergy
|
||||
START_PROCESSING(SSprocessing, src)
|
||||
|
||||
/datum/component/gargoyle/process()
|
||||
if (!gargoyle)
|
||||
return
|
||||
if (paused && gargoyle.loc != paused_loc)
|
||||
unpause()
|
||||
if (energy > 0)
|
||||
if (!transformed && !paused)
|
||||
energy = max(0,energy-0.05)
|
||||
else if (!transformed && isturf(gargoyle.loc))
|
||||
gargoyle.gargoyle_transformation()
|
||||
if (transformed)
|
||||
if (!statue)
|
||||
transformed = FALSE
|
||||
statue.damage(-0.5)
|
||||
energy = min(energy+0.3, 100)
|
||||
|
||||
/datum/component/gargoyle/proc/unpause()
|
||||
if (!paused || transformed)
|
||||
paused = FALSE
|
||||
paused_loc = null
|
||||
UnregisterSignal(gargoyle, COMSIG_ATOM_ENTERING)
|
||||
return
|
||||
if (gargoyle?.loc != paused_loc)
|
||||
paused = FALSE
|
||||
paused_loc = null
|
||||
energy = max(energy - 5, 0)
|
||||
if (energy == 0)
|
||||
gargoyle.gargoyle_transformation()
|
||||
UnregisterSignal(gargoyle, COMSIG_ATOM_ENTERING)
|
||||
|
||||
//verbs or action buttons...?
|
||||
/mob/living/carbon/human/proc/gargoyle_transformation()
|
||||
set name = "Gargoyle - Petrification"
|
||||
set category = "Abilities"
|
||||
set desc = "Turn yourself into (or back from) being a gargoyle."
|
||||
|
||||
if (stat == DEAD)
|
||||
return
|
||||
|
||||
var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle)
|
||||
if (comp)
|
||||
if (comp.energy <= 0 && isturf(loc))
|
||||
to_chat(src, "<span class='danger'>You suddenly turn into a statue as you run out of energy!</span>")
|
||||
else if (comp.cooldown > world.time)
|
||||
var/time_to_wait = (comp.cooldown - world.time) / (1 SECONDS)
|
||||
to_chat(src, "<span class='warning'>You can't transform just yet again! Wait for another [round(time_to_wait,0.1)] seconds!</span>")
|
||||
return
|
||||
if (istype(loc, /obj/structure/gargoyle))
|
||||
var/obj/structure/gargoyle/statue = loc
|
||||
qdel(statue)
|
||||
else if (isturf(loc))
|
||||
new /obj/structure/gargoyle(loc, src)
|
||||
|
||||
/mob/living/carbon/human/proc/gargoyle_pause()
|
||||
set name = "Gargoyle - Pause"
|
||||
set category = "Abilities"
|
||||
set desc = "Pause your energy while standing still, so you don't use up any more, though you will lose a small amount upon moving again."
|
||||
|
||||
if (stat)
|
||||
return
|
||||
|
||||
var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle)
|
||||
if (comp && !comp.transformed && !comp.paused)
|
||||
comp.paused = TRUE
|
||||
comp.paused_loc = loc
|
||||
comp.RegisterSignal(src, COMSIG_ATOM_ENTERING, /datum/component/gargoyle/proc/unpause)
|
||||
to_chat(src, "<span class='notice'>You start conserving your energy.</span>")
|
||||
|
||||
/mob/living/carbon/human/proc/gargoyle_checkenergy()
|
||||
set name = "Gargoyle - Check Energy"
|
||||
set category = "Abilities"
|
||||
set desc = "Check how much energy you have remaining as a gargoyle."
|
||||
|
||||
var/datum/component/gargoyle/comp = GetComponent(/datum/component/gargoyle)
|
||||
if (comp)
|
||||
to_chat(src, "<span class='notice'>You have [round(comp.energy,0.01)] energy remaining. It is currently [comp.paused ? "stable" : (comp.transformed ? "increasing" : "decreasing")].</span>")
|
||||
30
modular_chomp/code/game/machinery/autolathe_armory.dm
Normal file
30
modular_chomp/code/game/machinery/autolathe_armory.dm
Normal file
@@ -0,0 +1,30 @@
|
||||
/obj/machinery/autolathe/armory
|
||||
name = "ammolathe"
|
||||
desc = "An autolathe that produces ammunition using metal and glass."
|
||||
hacked = 1
|
||||
|
||||
/obj/machinery/autolathe/armory/tgui_static_data(mob/user)
|
||||
var/list/data = ..()
|
||||
|
||||
var/list/categories = list()
|
||||
var/list/recipes = list()
|
||||
for(var/datum/category_group/autolathe/A in autolathe_recipes.categories)
|
||||
categories += A.name
|
||||
for(var/datum/category_item/autolathe/arms/M in A.items)
|
||||
if(M.hidden && !hacked)
|
||||
continue
|
||||
if(M.man_rating > man_rating)
|
||||
continue
|
||||
recipes.Add(list(list(
|
||||
"category" = A.name,
|
||||
"name" = M.name,
|
||||
"ref" = REF(M),
|
||||
"requirements" = M.resources,
|
||||
"hidden" = M.hidden,
|
||||
"coeff_applies" = !M.no_scale,
|
||||
"is_stack" = M.is_stack,
|
||||
)))
|
||||
data["recipes"] = recipes
|
||||
data["categories"] = categories
|
||||
|
||||
return data
|
||||
@@ -0,0 +1,299 @@
|
||||
// Props
|
||||
/obj/structure/prop/desert_rock
|
||||
icon = 'modular_chomp/icons/obj/desert_planet/desert_rocks.dmi'
|
||||
desc = "Sandy and smooth from erosion."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
|
||||
/obj/structure/prop/desert_rock/rock
|
||||
name = "desert rock"
|
||||
|
||||
/obj/structure/prop/desert_rock/rock/attack_hand(mob/living/user)
|
||||
if(user.is_incorporeal())
|
||||
return
|
||||
to_chat(user, "You push on the [src].")
|
||||
var/movedir = user.dir
|
||||
if(do_after(user, 3 SECONDS, src))
|
||||
step(src, movedir)
|
||||
|
||||
/obj/structure/prop/desert_rock/rock/New()
|
||||
..()
|
||||
icon_state = "desert_rock[rand(0,6)]"
|
||||
|
||||
/obj/structure/prop/desert_rock/pebble
|
||||
name = "sandy pebble"
|
||||
density = FALSE
|
||||
|
||||
/obj/structure/prop/desert_rock/pebble/Crossed(atom/movable/AM as mob|obj)
|
||||
if(AM.is_incorporeal())
|
||||
return
|
||||
if(istype(AM, /mob/living))
|
||||
var/mob/living/M = AM
|
||||
if(M.m_intent == "run" && prob(5))
|
||||
M.Weaken(2)
|
||||
to_chat(M, "You trip over the [src]!")
|
||||
|
||||
/obj/structure/prop/desert_rock/pebble/New()
|
||||
..()
|
||||
icon_state = "desert_pebble[rand(0,6)]"
|
||||
|
||||
/obj/structure/prop/desert_rock/anthill
|
||||
name = "ant hill"
|
||||
desc = "See how many ants you can spot."
|
||||
icon = 'modular_chomp/icons/obj/desert_planet/desert_plants.dmi'
|
||||
icon_state = "anthill0"
|
||||
|
||||
/obj/structure/prop/desert_rock/anthill/New()
|
||||
..()
|
||||
icon_state = "anthill[rand(0,2)]"
|
||||
|
||||
/obj/structure/prop/desert_planet64x64
|
||||
name = "large rock"
|
||||
desc = "Sandy and smooth from erosion."
|
||||
icon = 'modular_chomp/icons/obj/desert_planet/desert_props_64x64.dmi'
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
can_buckle = FALSE
|
||||
|
||||
/obj/structure/prop/desert_planet64x64/lrock
|
||||
icon_state = "lrock"
|
||||
|
||||
/obj/structure/prop/desert_planet64x64/lrock1
|
||||
icon_state = "lrock1"
|
||||
|
||||
/obj/structure/prop/desert_planet64x64/lrock2
|
||||
icon_state = "lrock2"
|
||||
|
||||
/obj/structure/prop/desert_planet64x64/lrock3
|
||||
icon_state = "lrock3"
|
||||
|
||||
/obj/structure/prop/desert_planet64x64/lrock4
|
||||
icon_state = "lrock4"
|
||||
|
||||
/obj/structure/prop/desert_planet64x64/lribs
|
||||
name = "ribs"
|
||||
desc = "Bleached white by baking sunlight."
|
||||
icon_state = "lribs"
|
||||
|
||||
/obj/structure/prop/desert_planet64x64/lribs1
|
||||
name = "ribs"
|
||||
desc = "Bleached white by baking sunlight."
|
||||
icon_state = "lribs1"
|
||||
|
||||
/obj/structure/prop/desert_planet64x64/lskull
|
||||
name = "skull"
|
||||
desc = "Bleached white by baking sunlight."
|
||||
icon_state = "lskull"
|
||||
|
||||
/obj/structure/prop/desert_planet64x64/lbone
|
||||
name = "bone"
|
||||
desc = "Bleached white by baking sunlight."
|
||||
icon_state = "lbone"
|
||||
|
||||
/obj/structure/prop/desert_planet64x64/palmuria
|
||||
name = "palm"
|
||||
desc = "Stout and bushy."
|
||||
icon_state = "palmuria"
|
||||
|
||||
/obj/structure/prop/desert_planet64x64/palmuria1
|
||||
name = "palm"
|
||||
desc = "Stout and bushy."
|
||||
icon_state = "palmuria1"
|
||||
|
||||
/obj/structure/prop/desert_planet160x160
|
||||
name = "desert large boulder"
|
||||
desc = "Sandy and smooth from erosion."
|
||||
icon = 'modular_chomp/icons/obj/desert_planet/desert_planet_160x160.dmi'
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
can_buckle = FALSE
|
||||
|
||||
/obj/structure/prop/desert_planet160x160/largeboulder
|
||||
icon_state = "large_boulder"
|
||||
|
||||
/obj/structure/prop/desert_planet160x160/tallboulder
|
||||
icon_state = "tall_boulder"
|
||||
|
||||
/obj/structure/prop/desert_planet160x160/boulder
|
||||
icon_state = "boulder"
|
||||
|
||||
/obj/structure/prop/desert_planet160x160/lcactus
|
||||
name = "cactus"
|
||||
desc = "Large and prickly."
|
||||
icon_state = "lcactus"
|
||||
|
||||
/obj/structure/prop/desert_planet160x160/lcactus1
|
||||
name = "cactus"
|
||||
desc = "Large and prickly."
|
||||
icon_state = "lcactus1"
|
||||
|
||||
/obj/structure/prop/desert_planet160x160/lcactus2
|
||||
name = "cactus"
|
||||
desc = "Large and prickly."
|
||||
icon_state = "lcactus2"
|
||||
|
||||
/obj/structure/prop/desert_planet160x160/lcactus3
|
||||
name = "cactus"
|
||||
desc = "Large and prickly."
|
||||
icon_state = "lcactus3"
|
||||
|
||||
// Flora
|
||||
/obj/structure/flora/desert_planet
|
||||
name = "desert plant"
|
||||
desc = "Probably a succulent."
|
||||
icon = 'modular_chomp/icons/obj/desert_planet/desert_plants.dmi'
|
||||
|
||||
/obj/structure/flora/desert_planet/potted_plant
|
||||
name = "potted plant"
|
||||
desc = "Colloquially known as a pot plant."
|
||||
icon_state = "potplant0"
|
||||
|
||||
/obj/structure/flora/desert_planet/potted_plant/New()
|
||||
..()
|
||||
icon_state = "potplant[rand(0,2)]"
|
||||
|
||||
/obj/structure/flora/desert_planet/thicket
|
||||
name = "thicket"
|
||||
desc = "Weedy growths."
|
||||
icon_state = "thicket0"
|
||||
|
||||
/obj/structure/flora/desert_planet/thicket/New()
|
||||
..()
|
||||
icon_state = "thicket[rand(0,6)]"
|
||||
|
||||
/obj/structure/flora/desert_planet/shrub
|
||||
name = "shrub"
|
||||
desc = "Dense and weedy."
|
||||
icon_state = "shrub0"
|
||||
|
||||
/obj/structure/flora/desert_planet/shrub/New()
|
||||
..()
|
||||
icon_state = "shrub[rand(0,5)]"
|
||||
|
||||
/obj/structure/flora/desert_planet/bush
|
||||
name = "bush"
|
||||
desc = "Denser and weedier."
|
||||
icon_state = "bush0"
|
||||
|
||||
/obj/structure/flora/desert_planet/bush/New()
|
||||
..()
|
||||
icon_state = "bush[rand(0,5)]"
|
||||
|
||||
/obj/structure/flora/desert_planet/barrelcacti
|
||||
name = "barrel cacti"
|
||||
desc = "Small, adorable, and begging for a hug."
|
||||
icon_state = "barrelcacti0"
|
||||
|
||||
/obj/structure/flora/desert_planet/barrelcacti/New()
|
||||
..()
|
||||
icon_state = "barrelcacti[rand(0,3)]"
|
||||
|
||||
/obj/structure/flora/desert_planet/palmy
|
||||
name = "yucca bush"
|
||||
desc = "Probably not actually a yucca."
|
||||
icon_state = "palmy0"
|
||||
|
||||
/obj/structure/flora/desert_planet/palmy/New()
|
||||
..()
|
||||
icon_state = "palmy[rand(0,2)]"
|
||||
|
||||
/obj/structure/flora/desert_planet/shrubber
|
||||
name = "thorny bush"
|
||||
desc = "Makes for great fur accessories."
|
||||
icon_state = "shrubber0"
|
||||
|
||||
/obj/structure/flora/desert_planet/shrubber/New()
|
||||
..()
|
||||
icon_state = "shrubber[rand(0,2)]"
|
||||
|
||||
/obj/structure/flora/desert_planet/lbarrelcacti
|
||||
name = "barrel cactus"
|
||||
desc = "Absolutely begging for pets."
|
||||
icon_state = "lbarrelcacti0"
|
||||
|
||||
/obj/structure/flora/desert_planet/lbarrelcacti/New()
|
||||
..()
|
||||
icon_state = "lbarrelcacti[rand(0,2)]"
|
||||
|
||||
// Trees
|
||||
/obj/structure/flora/tree/desert_planet
|
||||
name = "palm tree"
|
||||
desc = "Tall palm tree, makes for a good shade."
|
||||
icon = 'modular_chomp/icons/obj/desert_planet/desert_planet_160x160.dmi'
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
can_buckle = FALSE
|
||||
product = /obj/item/stack/material/log
|
||||
product_amount = 50
|
||||
health = 2000
|
||||
max_health = 2000
|
||||
//var/fruit
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/palmtreeb
|
||||
icon_state = "palmtreeb"
|
||||
base_state = "palmr" // Necessary for stumps to work.
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/palmtreeb1
|
||||
icon_state = "palmtreeb1"
|
||||
base_state = "palml"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/palmtree
|
||||
icon_state = "palmtree"
|
||||
base_state = "palmr"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/palmtree1
|
||||
icon_state = "palmtree1"
|
||||
base_state = "palml"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/mpalmtreeb
|
||||
icon_state = "mpalmtreeb"
|
||||
base_state = "palmr"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/mpalmtreeb1
|
||||
icon_state = "mpalmtreeb1"
|
||||
base_state = "palml"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/mpalmtree
|
||||
icon_state = "mpalmtree"
|
||||
base_state = "palml"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/mpalmtree1
|
||||
icon_state = "mpalmtree1"
|
||||
base_state = "palmr"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/spalmtree
|
||||
icon_state = "spalmtree"
|
||||
base_state = "palmls"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/spalmtree1
|
||||
icon_state = "spalmtree1"
|
||||
base_state = "palmrs"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/spalmtree3
|
||||
icon_state = "spalmtree3"
|
||||
base_state = "palmls"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/spalmtree4
|
||||
icon_state = "spalmtree4"
|
||||
base_state = "palmrs"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/desert_tree
|
||||
name = "barren tree"
|
||||
desc = "Completely barren."
|
||||
icon_state = "desert_tree"
|
||||
base_state = "desert"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/desert_tree1
|
||||
name = "gnarled tree"
|
||||
desc = "Twisted but living."
|
||||
icon_state = "desert_tree1"
|
||||
base_state = "desert"
|
||||
|
||||
/obj/structure/flora/tree/desert_planet/desert_tree3
|
||||
name = "hardy tree"
|
||||
desc = "Thriving despite the conditions."
|
||||
icon_state = "desert_tree3"
|
||||
base_state = "desert"
|
||||
product_amount = 100
|
||||
health = 4000
|
||||
max_health = 4000
|
||||
169
modular_chomp/code/game/objects/structures/gargoyle.dm
Normal file
169
modular_chomp/code/game/objects/structures/gargoyle.dm
Normal file
@@ -0,0 +1,169 @@
|
||||
/obj/structure/gargoyle
|
||||
name = "statue"
|
||||
desc = "A very lifelike carving."
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
var/mob/living/carbon/human/gargoyle
|
||||
var/initial_sleep
|
||||
var/initial_blind
|
||||
var/initial_is_shifted
|
||||
var/initial_lying
|
||||
var/initial_lying_prev
|
||||
var/wagging
|
||||
var/flapping
|
||||
var/obj_integrity = 100
|
||||
var/original_int = 100
|
||||
var/max_integrity = 100
|
||||
var/stored_examine
|
||||
|
||||
/obj/structure/gargoyle/Initialize(mapload, var/mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
if (isspace(loc) || isopenspace(loc))
|
||||
anchored = FALSE
|
||||
if (!istype(H) || !isturf(H.loc))
|
||||
return
|
||||
var/datum/component/gargoyle/comp = H.GetComponent(/datum/component/gargoyle)
|
||||
if (comp)
|
||||
comp.cooldown = world.time + (15 SECONDS)
|
||||
comp.statue = src
|
||||
comp.transformed = TRUE
|
||||
comp.paused = FALSE
|
||||
gargoyle = H
|
||||
|
||||
max_integrity = H.getMaxHealth() + 100
|
||||
obj_integrity = H.health + 100
|
||||
original_int = obj_integrity
|
||||
name = "statue of [H.name]"
|
||||
desc = "A very lifelike statue."
|
||||
stored_examine = H.examine()
|
||||
description_fluff = H.get_description_fluff()
|
||||
|
||||
if (H.buckled)
|
||||
H.buckled.unbuckle_mob(H, TRUE)
|
||||
icon = H.icon
|
||||
copy_overlays(H)
|
||||
color = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
initial_sleep = H.sleeping
|
||||
initial_blind = H.eye_blind
|
||||
initial_is_shifted = H.is_shifted
|
||||
transform = H.transform
|
||||
layer = H.layer
|
||||
pixel_x = H.pixel_x
|
||||
pixel_y = H.pixel_y
|
||||
dir = H.dir
|
||||
initial_lying = H.lying
|
||||
initial_lying_prev = H.lying_prev
|
||||
H.sdisabilities |= MUTE
|
||||
if (H.appearance_flags & PIXEL_SCALE)
|
||||
appearance_flags |= PIXEL_SCALE
|
||||
wagging = H.wagging
|
||||
H.transforming = TRUE
|
||||
flapping = H.flapping
|
||||
H.toggle_tail(FALSE, FALSE)
|
||||
H.toggle_wing(FALSE, FALSE)
|
||||
H.visible_message("<span class='warning'>[H]'s skin rapidly turns to stone!</span>", "<span class='warning'>Your skin abruptly hardens as you turn to stone!</span>")
|
||||
H.forceMove(src)
|
||||
H.SetBlinded(0)
|
||||
H.SetSleeping(0)
|
||||
H.status_flags |= GODMODE
|
||||
H.updatehealth()
|
||||
H.canmove = 0
|
||||
|
||||
/obj/structure/gargoyle/Destroy()
|
||||
unpetrify()
|
||||
. = ..()
|
||||
|
||||
/obj/structure/gargoyle/examine_icon()
|
||||
var/icon/examine_icon = ..()
|
||||
examine_icon.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0))
|
||||
return examine_icon
|
||||
|
||||
/obj/structure/gargoyle/get_description_info()
|
||||
if (gargoyle)
|
||||
if (isspace(loc) || isopenspace(loc))
|
||||
return
|
||||
return "It can be [anchored ? "un" : ""]anchored with a wrench."
|
||||
|
||||
/obj/structure/gargoyle/examine(mob/user)
|
||||
. = ..()
|
||||
if (gargoyle && stored_examine)
|
||||
. += "The statue seems to have a bit more to them..."
|
||||
. += stored_examine
|
||||
return
|
||||
|
||||
/obj/structure/gargoyle/proc/unpetrify()
|
||||
if (!gargoyle)
|
||||
return
|
||||
var/datum/component/gargoyle/comp = gargoyle.GetComponent(/datum/component/gargoyle)
|
||||
if (comp)
|
||||
comp.cooldown = world.time + (15 SECONDS)
|
||||
comp.statue = null
|
||||
comp.transformed = FALSE
|
||||
gargoyle.forceMove(loc)
|
||||
gargoyle.transform = transform
|
||||
gargoyle.pixel_x = pixel_x
|
||||
gargoyle.pixel_y = pixel_y
|
||||
gargoyle.is_shifted = initial_is_shifted
|
||||
gargoyle.dir = dir
|
||||
gargoyle.lying = initial_lying
|
||||
gargoyle.lying_prev = initial_lying_prev
|
||||
gargoyle.toggle_tail(wagging, FALSE)
|
||||
gargoyle.toggle_wing(flapping, FALSE)
|
||||
gargoyle.sdisabilities &= ~MUTE //why is there no ADD_TRAIT etc here that's actually ussssed
|
||||
gargoyle.status_flags &= ~GODMODE
|
||||
gargoyle.SetBlinded(initial_blind)
|
||||
gargoyle.SetSleeping(initial_sleep)
|
||||
gargoyle.transforming = FALSE
|
||||
gargoyle.canmove = 1
|
||||
gargoyle.update_canmove()
|
||||
var/hurtmessage = ""
|
||||
if (obj_integrity < original_int)
|
||||
var/f = (original_int - obj_integrity) / 10
|
||||
for (var/x in 1 to 10)
|
||||
gargoyle.adjustBruteLoss(f)
|
||||
hurtmessage = " <b>You feel your body take the damage that was dealt while being stone!</b>"
|
||||
gargoyle.updatehealth()
|
||||
alpha = 0
|
||||
gargoyle.visible_message("<span class='warning'>[gargoyle]'s skin rapidly softens, returning them to normal!</span>", "<span class='warning'>Your skin softens, freeing your movement once more![hurtmessage]</span>")
|
||||
|
||||
/obj/structure/gargoyle/return_air()
|
||||
return return_air_for_internal_lifeform()
|
||||
|
||||
/obj/structure/gargoyle/return_air_for_internal_lifeform(var/mob/living/lifeform)
|
||||
var/air_type = /datum/gas_mixture/belly_air
|
||||
if(istype(lifeform))
|
||||
air_type = lifeform.get_perfect_belly_air_type()
|
||||
var/air = new air_type(1000)
|
||||
return air
|
||||
|
||||
/obj/structure/gargoyle/proc/damage(var/damage)
|
||||
obj_integrity = min(obj_integrity-damage, max_integrity)
|
||||
if(obj_integrity <= 0)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/gargoyle/take_damage(var/damage)
|
||||
damage(damage)
|
||||
|
||||
/obj/structure/gargoyle/attack_generic(var/mob/user, var/damage, var/attack_message = "hits")
|
||||
user.do_attack_animation(src)
|
||||
visible_message("<span class='danger'>[user] [attack_message] the [src]!</span>")
|
||||
damage(damage)
|
||||
|
||||
/obj/structure/gargoyle/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
|
||||
if(W.is_wrench())
|
||||
if (isspace(loc) || isopenspace(loc))
|
||||
to_chat(user, "<span class='warning'>You can't anchor that here!</span>")
|
||||
anchored = FALSE
|
||||
return ..()
|
||||
playsound(src, W.usesound, 50, 1)
|
||||
if (do_after(user, (2 SECONDS) * W.toolspeed, target = src))
|
||||
to_chat("<span class='notice'>You [anchored ? "un" : ""]anchor the [src].</span>")
|
||||
anchored = !anchored
|
||||
else if (!(W.flags & NOBLUDGEON))
|
||||
user.setClickCooldown(user.get_attack_speed(W))
|
||||
if(W.damtype == BRUTE || W.damtype == BURN)
|
||||
user.do_attack_animation(src)
|
||||
playsound(src, W.hitsound, 50, 1)
|
||||
damage(W.force)
|
||||
else
|
||||
return ..()
|
||||
@@ -1,136 +1,257 @@
|
||||
/* Testing
|
||||
// Parent turf.
|
||||
/turf/simulated/floor/outdoors/desert_planet
|
||||
name = "sand"
|
||||
desc = "Salty and gritty."
|
||||
icon = 'modular_chomp/icons/turf/desert_tiles.dmi'
|
||||
icon_edge = 'modular_chomp/icons/turf/outdoors_edge.dmi'
|
||||
can_dig = FALSE
|
||||
|
||||
/turf/simulated/floor/outdoors/desert_planet/sand
|
||||
name = "sand"
|
||||
desc = "Sandy, taste salty and gritty."
|
||||
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
|
||||
desc = "Salty and gritty."
|
||||
icon_state = "sand0"
|
||||
edge_blending_priority = 2
|
||||
turf_layers = list(/turf/simulated/floor/outdoors/rocks)
|
||||
initial_flooring = /decl/flooring/sand
|
||||
can_dig = false
|
||||
*/
|
||||
initial_flooring = /decl/flooring/desert_planet/sand
|
||||
|
||||
/turf/simulated/floor/outdoors/desert_planet/sand
|
||||
name = "sand"
|
||||
desc = "Salty and gritty."
|
||||
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
|
||||
icon_state = "sand"
|
||||
edge_blending_priority = 3
|
||||
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
|
||||
// Necessary to get the edges to generate correctly since we use a random-ish icon_state. Inelegant to hard code, but this is a one-off case.
|
||||
/turf/simulated/floor/outdoors/desert_planet/sand/get_edge_icon_state()
|
||||
return "sand"
|
||||
|
||||
/* Testing
|
||||
/decl/flooring/outdoors/sand
|
||||
name = "sand"
|
||||
desc = "Salty and gritty."
|
||||
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
|
||||
icon_base = "sand"
|
||||
footstep_sounds = list("human" = list(
|
||||
'sound/effects/footstep/asteroid1.ogg',
|
||||
'sound/effects/footstep/asteroid2.ogg',
|
||||
'sound/effects/footstep/asteroid3.ogg',
|
||||
'sound/effects/footstep/asteroid4.ogg',
|
||||
'sound/effects/footstep/asteroid5.ogg',
|
||||
'sound/effects/footstep/MedDirt1.ogg',
|
||||
'sound/effects/footstep/MedDirt2.ogg',
|
||||
'sound/effects/footstep/MedDirt3.ogg',
|
||||
'sound/effects/footstep/MedDirt4.ogg'))
|
||||
/turf/simulated/floor/outdoors/desert_planet/sand/Initialize(mapload)
|
||||
. = ..()
|
||||
icon_state = "sand[rand(0,2)]"
|
||||
|
||||
/turf/simulated/floor/outdoors/sand/Initialize(mapload)
|
||||
var/possiblesands = list(
|
||||
"ironsand1" = 50,
|
||||
"ironsand2" = 1,
|
||||
"ironsand3" = 1,
|
||||
"ironsand4" = 1,
|
||||
"ironsand5" = 1,
|
||||
"ironsand6" = 1,
|
||||
"ironsand7" = 1,
|
||||
"ironsand8" = 1,
|
||||
"ironsand9" = 1,
|
||||
"ironsand10" = 1,
|
||||
"ironsand11" = 1,
|
||||
"ironsand12" = 1,
|
||||
"ironsand13" = 1,
|
||||
"ironsand14" = 1,
|
||||
"ironsand15" = 1
|
||||
|
||||
)
|
||||
flooring_override = pickweight(possiblesands)
|
||||
return ..()
|
||||
|
||||
/turf/simulated/floor/water/hotspring
|
||||
name = "Hotsprings"
|
||||
desc = "A natural hotspring connecting to an aquifer. It seems the facility was built ontop of it."
|
||||
edge_blending_priority = -2
|
||||
movement_cost = 8
|
||||
depth = 2
|
||||
water_state = "water_shallow"
|
||||
outdoors = FALSE
|
||||
|
||||
/turf/simulated/floor/water/hotspring/Entered(atom/movable/AM, atom/oldloc)
|
||||
if(istype(AM, /mob/living))
|
||||
var/mob/living/L = AM
|
||||
L.update_water()
|
||||
if(L.check_submerged() <= 0)
|
||||
return
|
||||
if(!istype(oldloc, /turf/simulated/floor/water/hotspring))
|
||||
to_chat(L, "<span class='warning'>You feel an overwhelming wave of warmth from entering \the [src]!</span>")
|
||||
AM.water_act(5)
|
||||
..()
|
||||
|
||||
|
||||
*/
|
||||
/turf/simulated/floor/outdoors/desert_planet/sand/attackby(var/obj/item/W, var/mob/user)
|
||||
if(istype(W, /obj/item/weapon/shovel))
|
||||
to_chat(user, "<span class='notice'>You begin to remove \the [src] with your [W].</span>")
|
||||
if(do_after(user, 4 SECONDS * W.toolspeed))
|
||||
to_chat(user, "<span class='notice'>\The [src] has been dug up, and now lies in a pile nearby.</span>")
|
||||
icon_state = "sand_dug"
|
||||
new /obj/item/weapon/ore/glass (src)
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You decide to not finish removing \the [src].</span>")
|
||||
else
|
||||
..()
|
||||
|
||||
/turf/simulated/floor/outdoors/desert_planet/deep_sand
|
||||
name = "sand"
|
||||
desc = "Salty and gritty."
|
||||
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
|
||||
icon_state = "deep_sand"
|
||||
edge_blending_priority = 2
|
||||
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
|
||||
desc = "Really gets everywhere."
|
||||
icon_state = "deep_sand0"
|
||||
edge_blending_priority = 1
|
||||
movement_cost = 3
|
||||
initial_flooring = /decl/flooring/desert_planet/deep_sand
|
||||
|
||||
/turf/simulated/floor/outdoors/desert_planet/deep_sand/Initialize(mapload)
|
||||
. = ..()
|
||||
icon_state = "deep_sand[rand(0,2)]"
|
||||
|
||||
/turf/simulated/floor/outdoors/desert_planet/grass
|
||||
name = "grass"
|
||||
desc = "Lively green grass, soft to walk on."
|
||||
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
|
||||
icon_state = "grass"
|
||||
edge_blending_priority = 6
|
||||
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
|
||||
edge_blending_priority = 5
|
||||
initial_flooring = /decl/flooring/desert_planet/grass
|
||||
|
||||
/turf/simulated/floor/outdoors/desert_planet/deep_grass
|
||||
name = "dense grass"
|
||||
desc = "Dense patch of grass, seems like a soft spot to lay on."
|
||||
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
|
||||
icon_state = "deep_grass"
|
||||
edge_blending_priority = 7
|
||||
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
|
||||
edge_blending_priority = 6
|
||||
initial_flooring = /decl/flooring/desert_planet/deep_grass
|
||||
|
||||
/turf/simulated/floor/outdoors/desert_planet/gravel
|
||||
name = "gravel"
|
||||
desc = "Mix of dirt and sand, it crumbles in your hand."
|
||||
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
|
||||
icon_state = "gravel"
|
||||
edge_blending_priority = 5
|
||||
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
|
||||
edge_blending_priority = 3
|
||||
initial_flooring = /decl/flooring/desert_planet/gravel
|
||||
|
||||
/turf/simulated/floor/outdoors/desert_planet/mud
|
||||
name = "mud"
|
||||
desc = "Squishy damp dirt, smells muddy."
|
||||
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
|
||||
icon_state = "mud"
|
||||
edge_blending_priority = 4
|
||||
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
|
||||
initial_flooring = /decl/flooring/desert_planet/mud
|
||||
|
||||
// At last we've come full circle, a floor which is actually a wall.
|
||||
/turf/simulated/floor/outdoors/desert_planet/stonewall
|
||||
name = "sandstone"
|
||||
desc = "Rough sandstone."
|
||||
icon_state = "stonewall"
|
||||
density = TRUE
|
||||
opacity = TRUE
|
||||
edge_blending_priority = 7
|
||||
initial_flooring = /decl/flooring/desert_planet/stonewall
|
||||
turf_layers = list(/turf/simulated/floor/outdoors/rocks)
|
||||
var/last_act = 0
|
||||
|
||||
// Stolen from mineral turf code.
|
||||
/turf/simulated/floor/outdoors/desert_planet/stonewall/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(!user.IsAdvancedToolUser())
|
||||
to_chat(user, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/weapon/pickaxe))
|
||||
if(!istype(user.loc, /turf))
|
||||
return
|
||||
|
||||
var/obj/item/weapon/pickaxe/P = W
|
||||
if(last_act + P.digspeed > world.time)//prevents message spam
|
||||
return
|
||||
last_act = world.time
|
||||
|
||||
playsound(user, P.drill_sound, 20, 1)
|
||||
to_chat(user, "<span class='notice'>You start [P.drill_verb].</span>")
|
||||
|
||||
if(do_after(user,P.digspeed))
|
||||
|
||||
to_chat(user, "<span class='notice'>You finish [P.drill_verb] \the [src].</span>")
|
||||
new /obj/item/stack/material/sandstone(src)
|
||||
density = FALSE
|
||||
opacity = FALSE
|
||||
demote() // Converts the turf to the next layer in turf_layers.
|
||||
..()
|
||||
|
||||
/turf/simulated/floor/outdoors/desert_planet/sandrock
|
||||
name = "sandstone tiles"
|
||||
desc = "Tightly joined in a mesmerizing lattice."
|
||||
icon_state = "sandrock"
|
||||
density = TRUE
|
||||
opacity = TRUE
|
||||
initial_flooring = /decl/flooring/desert_planet/sandrock
|
||||
|
||||
// Declarations (for initial_flooring)
|
||||
/decl/flooring/desert_planet // Yeah don't use this one, it's a parent just for setting icon.
|
||||
name = "desert stuff"
|
||||
desc = "If you see this, this turf is using the wrong decl."
|
||||
icon = 'modular_chomp/icons/turf/desert_tiles.dmi'
|
||||
icon_base = null
|
||||
|
||||
/decl/flooring/desert_planet/sand
|
||||
name = "sand"
|
||||
desc = "Salty and gritty."
|
||||
icon_base = "sand"
|
||||
has_base_range = 2
|
||||
|
||||
/decl/flooring/desert_planet/deep_sand
|
||||
name = "sand"
|
||||
desc = "Really gets everywhere."
|
||||
icon_base = "deep_sand"
|
||||
has_base_range = 2
|
||||
|
||||
/decl/flooring/desert_planet/grass
|
||||
name = "grass"
|
||||
desc = "Lively green grass, soft to walk on."
|
||||
icon_base = "grass"
|
||||
|
||||
/decl/flooring/desert_planet/deep_grass
|
||||
name = "dense grass"
|
||||
desc = "Dense patch of grass, seems like a soft spot to lay on."
|
||||
icon_base = "deep_grass"
|
||||
|
||||
/decl/flooring/desert_planet/gravel
|
||||
name = "gravel"
|
||||
desc = "Mix of dirt and sand, it crumbles in your hand."
|
||||
icon_base = "gravel"
|
||||
|
||||
/decl/flooring/desert_planet/mud
|
||||
name = "mud"
|
||||
desc = "Squishy damp dirt, smells muddy."
|
||||
icon_base = "mud"
|
||||
|
||||
/decl/flooring/desert_planet/stonewall
|
||||
name = "sandstone"
|
||||
desc = "Rough sandstone."
|
||||
icon_base = "stonewall"
|
||||
|
||||
/decl/flooring/desert_planet/sandrock
|
||||
name = "sandstone tiles"
|
||||
desc = "Tightly joined in a mesmerizing lattice."
|
||||
icon_base = "sandrock"
|
||||
flags = TURF_HAS_EDGES | TURF_HAS_CORNERS
|
||||
|
||||
/*
|
||||
/obj/effect/floor_decal/desert_planet/floor/sand0_edge
|
||||
name = "sand0_edge"
|
||||
icon = 'icons/turf/desert_planet.dmi'
|
||||
icon_state = "sand0_edge"
|
||||
|
||||
/obj/effect/floor_decal/desert_planet/floor/gravel_edge
|
||||
name = "gravel_edge"
|
||||
icon = 'icons/turf/desert_planet.dmi'
|
||||
icon_state = "gravel_edge"
|
||||
|
||||
/obj/effect/floor_decal/desert_planet/floor/mud_edge
|
||||
name = "mud_edge"
|
||||
icon = 'icons/turf/desert_planet.dmi'
|
||||
icon_state = "mud_edge"
|
||||
|
||||
/obj/effect/floor_decal/desert_planet/floor/grass_edge
|
||||
name = "grass_edge"
|
||||
icon = 'icons/turf/desert_planet.dmi'
|
||||
icon_state = "grass_edge"
|
||||
|
||||
/obj/effect/floor_decal/desert_planet/floor/deep_grass_edge
|
||||
name = "deep_grass_edge"
|
||||
icon = 'icons/turf/desert_planet.dmi'
|
||||
icon_state = "deep_grass_edge"
|
||||
*/
|
||||
|
||||
/* #No idea how water tiles work
|
||||
/turf/simulated/floor/outdoors/desert_planet/water
|
||||
name = "water"
|
||||
desc = "Clear cool water, looks potable."
|
||||
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
|
||||
icon = 'icons/turf/desert_planet.dmi'
|
||||
icon_state = "water"
|
||||
edge_blending_priority = 8
|
||||
var/water_state = "water_shallow"
|
||||
var/under_state = "sand"
|
||||
can_be_plated = FALSE
|
||||
outdoors = OUTDOORS_YES
|
||||
flags = TURF_ACID_IMMUNE
|
||||
layer = WATER_FLOOR_LAYER
|
||||
can_dirty = FALSE // It's water
|
||||
var/depth = 1 // Higher numbers indicates deeper water.
|
||||
var/reagent_type = "water"
|
||||
edge_blending_priority = 2
|
||||
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
|
||||
|
||||
/turf/simulated/floor/outdoors/desert_planet/deep_water
|
||||
name = "deep water"
|
||||
desc = "deep enough you can't see the bottom of it."
|
||||
icon = 'modular_chomp/icons/turf/desert_planet.dmi'
|
||||
icon = 'icons/turf/desert_planet.dmi'
|
||||
icon_state = "deep_water"
|
||||
edge_blending_priority = 9
|
||||
var/water_state = "water_shallow"
|
||||
var/under_state = "sand"
|
||||
can_be_plated = FALSE
|
||||
outdoors = OUTDOORS_YES
|
||||
flags = TURF_ACID_IMMUNE
|
||||
layer = WATER_FLOOR_LAYER
|
||||
can_dirty = FALSE // It's water
|
||||
var/depth = 2 // Higher numbers indicates deeper water.
|
||||
var/reagent_type = "water"
|
||||
edge_blending_priority = 4
|
||||
turf_layers = list(/turf/simulated/floor/outdoors/desert_planet/sand)
|
||||
|
||||
//I want this for the water tiles
|
||||
/turf/simulated/floor/water
|
||||
name = "shallow water"
|
||||
desc = "A body of water. It seems shallow enough to walk through, if needed."
|
||||
icon = 'icons/turf/outdoors.dmi'
|
||||
icon_state = "seashallow" // So it shows up in the map editor as water.
|
||||
var/water_state = "water_shallow"
|
||||
var/under_state = "rock"
|
||||
edge_blending_priority = -1
|
||||
movement_cost = 4
|
||||
can_be_plated = FALSE
|
||||
outdoors = OUTDOORS_YES
|
||||
flags = TURF_ACID_IMMUNE
|
||||
|
||||
layer = WATER_FLOOR_LAYER
|
||||
|
||||
can_dirty = FALSE // It's water
|
||||
|
||||
var/depth = 1 // Higher numbers indicates deeper water.
|
||||
|
||||
var/reagent_type = "water"
|
||||
// var/datum/looping_sound/water/soundloop CHOMPEdit: Removing soundloop for now.
|
||||
*/
|
||||
|
||||
25
modular_chomp/code/modules/artifice/deadringer.dm
Normal file
25
modular_chomp/code/modules/artifice/deadringer.dm
Normal file
@@ -0,0 +1,25 @@
|
||||
/obj/item/weapon/deadringer/process()
|
||||
if(activated)
|
||||
if (ismob(src.loc))
|
||||
var/mob/living/carbon/human/H = src.loc
|
||||
watchowner = H
|
||||
if(H.getBruteLoss() > bruteloss_prev || H.getFireLoss() > fireloss_prev)
|
||||
deathprevent()
|
||||
activated = 0
|
||||
if(watchowner.isSynthetic())
|
||||
to_chat(watchowner, "<font color='blue'>You fade into nothingness! [src]'s screen blinks, being unable to copy your synthetic body!</font>")
|
||||
else
|
||||
to_chat(watchowner, "<font color='blue'>You fade into nothingness, leaving behind a fake body!</font>")
|
||||
icon_state = "deadringer_cd"
|
||||
timer = 5
|
||||
return
|
||||
if(timer > 0)
|
||||
timer--
|
||||
if(timer == 2)
|
||||
reveal()
|
||||
if(corpse)
|
||||
new /obj/effect/effect/smoke/chem(corpse.loc)
|
||||
qdel(corpse)
|
||||
if(timer == 0)
|
||||
icon_state = "deadringer"
|
||||
return
|
||||
6
modular_chomp/code/modules/clothing/clothing_icons.dm
Normal file
6
modular_chomp/code/modules/clothing/clothing_icons.dm
Normal file
@@ -0,0 +1,6 @@
|
||||
/obj/item/clothing/shoes/apply_blood(var/image/standing)
|
||||
if(blood_DNA && blood_sprite_state && ishuman(loc))
|
||||
var/mob/living/carbon/human/H = loc
|
||||
var/image/bloodsies = image(icon = H.digitigrade ? 'modular_chomp/icons/mob/human_races/masks/blood_digitigrade.dmi' : H.species.get_blood_mask(H), icon_state = blood_sprite_state)
|
||||
bloodsies.color = blood_color
|
||||
standing.add_overlay(bloodsies)
|
||||
@@ -0,0 +1,71 @@
|
||||
/obj/item/weapon/rig/ch/precursor
|
||||
name = "xenotech hardsuit control module"
|
||||
desc = "A purple hardsuit gleaming with energy and alien metals."
|
||||
suit_type = "precursor hardsuit"
|
||||
icon = 'modular_chomp/icons/obj/rig_modules_ch.dmi'
|
||||
icon_state = "precursor_rig"
|
||||
armor = list(melee = 50, bullet = 50, laser = 70, energy = 70, bomb = 60, bio = 100, rad = 80)
|
||||
var/block_chance = 15
|
||||
slowdown = 0
|
||||
|
||||
chest_type = /obj/item/clothing/suit/space/rig/ch/precursor
|
||||
helm_type = /obj/item/clothing/head/helmet/space/rig/ch/precursor
|
||||
glove_type = /obj/item/clothing/gloves/gauntlets/rig/ch/precursor
|
||||
boot_type = /obj/item/clothing/shoes/magboots/rig/ch/precursor
|
||||
|
||||
req_access = list()
|
||||
req_one_access = list()
|
||||
|
||||
/obj/item/clothing/suit/space/rig/ch/precursor
|
||||
name = "protective vest"
|
||||
icon = 'icons/obj/clothing/spacesuits_ch.dmi'
|
||||
desc = "Light weight but oddly protective plating."
|
||||
var/block_chance = 15
|
||||
|
||||
/obj/item/clothing/head/helmet/space/rig/ch/precursor
|
||||
name = "helmet"
|
||||
icon = 'icons/obj/clothing/hats_ch.dmi'
|
||||
desc = "A protective dome for your head."
|
||||
var/block_chance = 15
|
||||
|
||||
/obj/item/clothing/gloves/gauntlets/rig/ch/precursor
|
||||
name = "gloves"
|
||||
icon = 'icons/obj/clothing/gloves_ch.dmi'
|
||||
desc = "Gloves created with alien tech"
|
||||
var/block_chance = 15
|
||||
|
||||
/obj/item/clothing/shoes/magboots/rig/ch/precursor
|
||||
name = "boots"
|
||||
icon = 'icons/obj/clothing/shoes_ch.dmi'
|
||||
desc = "A pair of grabby boots"
|
||||
var/block_chance = 15
|
||||
|
||||
/obj/item/weapon/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
if(prob(block_chance))
|
||||
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/suit/space/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
if(prob(block_chance))
|
||||
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
if(prob(block_chance))
|
||||
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/gloves/gauntlets/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
if(prob(block_chance))
|
||||
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/clothing/shoes/magboots/rig/ch/precursor/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
|
||||
if(prob(block_chance))
|
||||
user.visible_message("<span class='danger'>\The [src] completely absorbs [attack_text]!</span>")
|
||||
return TRUE
|
||||
return FALSE
|
||||
@@ -1,3 +1,4 @@
|
||||
/obj/item/weapon/rig
|
||||
var/protean = 0
|
||||
var/obj/item/weapon/storage/backpack/rig_storage
|
||||
var/obj/item/weapon/storage/backpack/rig_storage
|
||||
permeability_coefficient = 0 //Protect the squishies, after all this shit should be waterproof.
|
||||
|
||||
23
modular_chomp/code/modules/economy/cash_register.dm
Normal file
23
modular_chomp/code/modules/economy/cash_register.dm
Normal file
@@ -0,0 +1,23 @@
|
||||
/obj/machinery/cash_register/medical
|
||||
req_access = list()
|
||||
req_one_access = list(access_medical,access_heads)
|
||||
|
||||
/obj/machinery/cash_register/engineering
|
||||
req_access = list()
|
||||
req_one_access = list(access_engine_equip,access_heads)
|
||||
|
||||
/obj/machinery/cash_register/science
|
||||
req_access = list()
|
||||
req_one_access = list(access_tox,access_heads)
|
||||
|
||||
/obj/machinery/cash_register/security
|
||||
req_access = list()
|
||||
req_one_access = list(access_brig,access_heads)
|
||||
|
||||
/obj/machinery/cash_register/cargo
|
||||
req_access = list()
|
||||
req_one_access = list(access_cargo,access_heads)
|
||||
|
||||
/obj/machinery/cash_register/civilian
|
||||
req_access = list()
|
||||
req_one_access = list(access_kitchen,access_bar,access_hydroponics,access_heads)
|
||||
@@ -13,3 +13,6 @@
|
||||
var/hide_glasses = FALSE
|
||||
var/speech_sound_enabled = TRUE
|
||||
var/nutrition_hidden = FALSE
|
||||
|
||||
/mob/living/carbon/human/ai_controlled
|
||||
low_priority = TRUE
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
/datum/species/vox
|
||||
icobase = 'icons/mob/human_races/r_vox_ch.dmi'
|
||||
tail = "voxtail"
|
||||
tail_animation = 'icons/mob/species/vox/tail.dmi'
|
||||
speech_chance = 50 // As long as we're making the option to disable it, might as well bump up the chances when it is enabled
|
||||
inherent_verbs = list(
|
||||
/mob/living/carbon/human/proc/toggle_speech_sounds
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
/mob/living/simple_mob/slime/promethean/character_directory_species()
|
||||
if (humanform)
|
||||
return "[humanform.custom_species ? humanform.custom_species : (humanform.species ? humanform.species.name : "Promethean Blob")]"
|
||||
return "Promethean Blob"
|
||||
@@ -380,6 +380,11 @@
|
||||
return
|
||||
..()
|
||||
|
||||
/mob/living/simple_mob/protean_blob/character_directory_species()
|
||||
if (humanform)
|
||||
return "[humanform.custom_species ? humanform.custom_species : (humanform.species ? humanform.species.name : "Protean")]"
|
||||
return "Protean"
|
||||
|
||||
var/global/list/disallowed_protean_accessories = list(
|
||||
/obj/item/clothing/accessory/holster,
|
||||
/obj/item/clothing/accessory/storage,
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
if(!istype(refactory))
|
||||
to_chat(caller,"<span class='warning'>You don't have a working refactory module!</span>")
|
||||
return
|
||||
var/choice = tgui_input_list(caller,"Pick the bodypart to change:", "Refactor - One Bodypart", species.has_limbs)
|
||||
|
||||
var/choice = tgui_input_list(src,"Pick the bodypart to change:", "Refactor - One Bodypart", species.has_limbs)
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
@@ -66,7 +67,7 @@
|
||||
var/datum/robolimb/M = chargen_robolimbs[company]
|
||||
if(!(choice in M.parts))
|
||||
continue
|
||||
if(impersonate_bodytype in M.species_cannot_use)
|
||||
if(species?.base_species in M.species_cannot_use)
|
||||
continue
|
||||
if(M.whitelisted_to && !(ckey in M.whitelisted_to))
|
||||
continue
|
||||
@@ -127,7 +128,7 @@
|
||||
var/datum/robolimb/M = chargen_robolimbs[company]
|
||||
if(!(BP_TORSO in M.parts))
|
||||
continue
|
||||
if(impersonate_bodytype in M.species_cannot_use)
|
||||
if(species?.base_species in M.species_cannot_use)
|
||||
continue
|
||||
if(M.whitelisted_to && !(ckey in M.whitelisted_to))
|
||||
continue
|
||||
@@ -283,7 +284,6 @@
|
||||
|
||||
var/new_species = tgui_input_list(usr, "Please select a species to emulate.", "Shapeshifter Body", GLOB.playable_species)
|
||||
if(new_species)
|
||||
impersonate_bodytype = new_species
|
||||
species?.base_species = new_species // Really though you better have a species
|
||||
regenerate_icons() //Expensive, but we need to recrunch all the icons we're wearing
|
||||
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
knockout_message = "collapses inwards, forming a disordered puddle of gray goo."
|
||||
remains_type = /obj/effect/decal/cleanable/ash
|
||||
|
||||
selects_bodytype = SELECTS_BODYTYPE_SHAPESHIFTER
|
||||
base_species = SPECIES_HUMAN
|
||||
|
||||
blood_color = "#505050" //This is the same as the 80,80,80 below, but in hex
|
||||
flesh_color = "#505050"
|
||||
base_color = "#FFFFFF" //Color mult, start out with this
|
||||
@@ -126,9 +129,12 @@
|
||||
saved_nif.quick_implant(H)
|
||||
|
||||
/datum/species/protean/get_bodytype(var/mob/living/carbon/human/H)
|
||||
if(H)
|
||||
return H.impersonate_bodytype || ..()
|
||||
return ..()
|
||||
if(!H || base_species == name) return ..()
|
||||
var/datum/species/S = GLOB.all_species[base_species]
|
||||
return S.get_bodytype(H)
|
||||
|
||||
/datum/species/protean/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
|
||||
return GLOB.playable_species
|
||||
|
||||
/datum/species/protean/handle_post_spawn(var/mob/living/carbon/human/H)
|
||||
..()
|
||||
|
||||
@@ -44,6 +44,9 @@
|
||||
/datum/species/custom
|
||||
digi_allowed = TRUE
|
||||
|
||||
/datum/species/shapeshifter/promethean
|
||||
digi_allowed = TRUE
|
||||
|
||||
/datum/species/unathi
|
||||
digi_allowed = TRUE
|
||||
vore_belly_default_variant = "L"
|
||||
@@ -72,3 +75,6 @@
|
||||
/datum/species/xenochimera
|
||||
digi_allowed = TRUE
|
||||
|
||||
/datum/species/protean
|
||||
digi_allowed = TRUE
|
||||
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
|
||||
var/mob/living/carbon/human/DraggedH = src
|
||||
|
||||
//make sure src (the dragged) is a teshari
|
||||
if(DraggedH.species.name == SPECIES_TESHARI)
|
||||
//make sure src (the dragged) is a teshari (or shaped like one)
|
||||
if(DraggedH.species.get_bodytype() == SPECIES_TESHARI)
|
||||
var/mob/living/M = over_object
|
||||
// only perform the grab if; grabber and grabbed adjacent, caller is grabbed OR grabber, and the grabbed's grab preference is true.
|
||||
if(holder_type && istype(M) && Adjacent(M) && (usr == M || usr == DraggedH) && DraggedH != M && !M.incapacitated() && DraggedH.pickup_pref && (M != usr || (M == usr && M.pickup_active)) && (DraggedH.a_intent == I_HELP && M.a_intent == I_HELP)) //VOREStation Edit
|
||||
@@ -23,7 +23,7 @@
|
||||
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
|
||||
var/mob/living/carbon/human/H = A
|
||||
if(istype(H))
|
||||
if(H.species.name == SPECIES_TESHARI)
|
||||
if(H.species.get_bodytype() == SPECIES_TESHARI)
|
||||
return 1
|
||||
|
||||
return ..()
|
||||
@@ -3,3 +3,6 @@
|
||||
|
||||
/datum/trait/positive/linguist
|
||||
custom_only = FALSE
|
||||
|
||||
/datum/trait/positive/toxin_gut
|
||||
custom_only = FALSE
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
for(var/f in list(BP_L_FOOT, BP_R_FOOT))
|
||||
var/obj/item/organ/external/foot/foot = get_organ(f)
|
||||
if(istype(foot) && foot.is_hidden_by_tail()) //If either foot is hidden by the tail, don't render footwear.
|
||||
if(istype(foot) && foot.is_hidden_by_sprite_accessory()) //If either foot is hidden by the tail, don't render footwear.
|
||||
return
|
||||
|
||||
var/obj/item/clothing/shoes/shoe = shoes
|
||||
@@ -107,4 +107,4 @@
|
||||
|
||||
/mob/living/carbon/human/update_tail_showing()
|
||||
. = ..()
|
||||
update_vore_tail_sprite()
|
||||
update_vore_tail_sprite()
|
||||
|
||||
@@ -104,3 +104,6 @@
|
||||
var/vs_fullness = vore_fullness_ex[belly_class]
|
||||
if(vs_fullness > 0)
|
||||
add_overlay("[icon_state]_[belly_class]-[vs_fullness]")
|
||||
|
||||
/mob/living/simple_mob/proc/character_directory_species()
|
||||
return "simplemob"
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
/mob/living/simple_mob/humanoid/cultist/human/bloodjaunt/fireball //Teleporting Cultists, now with fireballs
|
||||
name = "Burning Mage"
|
||||
desc = "An indiuval wrapped up in red robes, with orange highlights, their paws glowing.."
|
||||
icon_state = "fire-fluff"
|
||||
icon_living = "fire-fluff"
|
||||
special_attack_min_range = 4
|
||||
special_attack_max_range = 7
|
||||
special_attack_cooldown = 10 SECONDS
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 10
|
||||
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged
|
||||
projectiletype = /obj/item/projectile/energy/fireball
|
||||
|
||||
/mob/living/simple_mob/humanoid/cultist/noodle
|
||||
name = "Converted"
|
||||
desc = "An indiuval wrapped up in a makeshift rig, made from fallen cultist."
|
||||
icon_state = "cobra-cultist"
|
||||
icon_living = "cobra-cultist"
|
||||
maxHealth = 150
|
||||
health = 150
|
||||
|
||||
faction = "cult"
|
||||
|
||||
status_flags = 0
|
||||
|
||||
response_help = "pokes"
|
||||
response_disarm = "shoves"
|
||||
response_harm = "hits"
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 25
|
||||
attack_sharp = 1
|
||||
attack_edge = 1
|
||||
attacktext = list("slashed", "stabbed")
|
||||
armor = list(melee = 60, bullet = 40, laser = 60, energy = 80, bomb = 25, bio = 100, rad = 100)
|
||||
attack_sound = 'sound/weapons/rapidslice.ogg'
|
||||
movement_cooldown = 4
|
||||
projectiletype = /obj/item/projectile/energy/plasma/vepr
|
||||
projectilesound = 'sound/weapons/spiderlunge.ogg'
|
||||
movement_cooldown = 2
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/ranged
|
||||
@@ -0,0 +1,52 @@
|
||||
//This hivebots are meant to be high threats, and a tad more fitting of the alien places they tend to be in. Aka mini-bosses.
|
||||
|
||||
/mob/living/simple_mob/mechanical/hivebot/precusor
|
||||
name = "Precursor Hivebot"
|
||||
icon = 'modular_chomp/icons/mob/hivebot.dmi'
|
||||
icon_state = "precursorhive"
|
||||
icon_living = "precursorhive"
|
||||
attacktext = list("prodded")
|
||||
maxHealth = 5 LASERS_TO_KILL // 150 health
|
||||
health = 5 LASERS_TO_KILL
|
||||
movement_cooldown = 4
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
|
||||
var/obj/item/shield_projector/shields = null
|
||||
|
||||
/mob/living/simple_mob/mechanical/hivebot/precusor/Initialize(mapload)
|
||||
shields = new /obj/item/shield_projector/rectangle/automatic/hivebot_drone(src)
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/simple_mob/mechanical/hivebot/precusor/machinegun
|
||||
projectiletype = /obj/item/projectile/bullet/hivebot
|
||||
base_attack_cooldown = 0 // Extremly rapid fire with rather weak bullets.
|
||||
|
||||
/mob/living/simple_mob/mechanical/hivebot/precusor/laser
|
||||
projectiletype = /obj/item/projectile/beam/precursor
|
||||
projectile_dispersion = 5
|
||||
projectile_accuracy = -30
|
||||
|
||||
/mob/living/simple_mob/mechanical/hivebot/precusor/lobber
|
||||
projectiletype = /obj/item/projectile/arc/blue_energy/precusor
|
||||
|
||||
|
||||
/obj/item/projectile/arc/blue_energy/precusor
|
||||
name = "energy missile"
|
||||
icon_state = "force_missile"
|
||||
armor_penetration = 10
|
||||
damage = 50 // Mimics the precusor laser damage and armor peircing with a tad more damage because of the lobbying style.
|
||||
damage_type = BURN
|
||||
color = "#A020F0"
|
||||
|
||||
/obj/item/shield_projector/rectangle/automatic/hivebot_drone
|
||||
shield_health = 100
|
||||
max_shield_health = 100
|
||||
shield_regen_delay = 5 SECONDS
|
||||
shield_regen_amount = 20
|
||||
size_x = 3
|
||||
size_y = 3
|
||||
color = "#A020F0"
|
||||
high_color = "#A020F0"
|
||||
low_color = "#A020F0"
|
||||
@@ -0,0 +1,5 @@
|
||||
//Giving the tank hivebot class a new look,
|
||||
/mob/living/simple_mob/mechanical/hivebot/tank
|
||||
icon = 'modular_chomp/icons/mob/hivebot.dmi'
|
||||
icon_state = "blue"
|
||||
icon_living = "blue"
|
||||
@@ -1,8 +1,15 @@
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax
|
||||
movement_cooldown = 1 //Because normal Gygaxes are tougher then ths boss version with 0 speed
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax/dark/advanced
|
||||
movement_cooldown = 0 //Because AADG needs all the help it can get.
|
||||
|
||||
/mob/living/simple_mob/mechanical/mecha/combat/gygax/aerostat
|
||||
desc = "A Vir System Authority automated combat mech with an aged apperance."
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
say_list = /datum/say_list/gygax_aerostat
|
||||
|
||||
|
||||
/datum/say_list/gygax_aerostat
|
||||
speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.")
|
||||
emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity")
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable
|
||||
name = "Behemoth"
|
||||
real_name = "Behemoth"
|
||||
desc = "The pinnacle of occult technology, Behemoths are nothing shy of both an Immovable Object, and Unstoppable Force."
|
||||
melee_damage_lower = 45
|
||||
melee_damage_upper = 55
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/intentional/adv_dark_gygax
|
||||
projectiletype = /obj/item/projectile/icicle
|
||||
|
||||
|
||||
/mob/living/simple_mob/construct/juggernaut/behemoth/unstoppable/bullet_act(var/obj/item/projectile/P)
|
||||
var/reflectchance = 20 - round(P.damage/3)
|
||||
if(prob(reflectchance))
|
||||
visible_message("<span class='danger'>The [P.name] gets reflected by [src]'s shell!</span>", \
|
||||
"<span class='userdanger'>The [P.name] gets reflected by [src]'s shell!</span>")
|
||||
|
||||
// Find a turf near or on the original location to bounce to
|
||||
if(P.starting)
|
||||
var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
|
||||
var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
|
||||
var/turf/curloc = get_turf(src)
|
||||
|
||||
// redirect the projectile
|
||||
P.redirect(new_x, new_y, curloc, src)
|
||||
P.reflected = 1
|
||||
|
||||
return -1 // complete projectile permutation
|
||||
|
||||
return (..(P))
|
||||
@@ -0,0 +1,47 @@
|
||||
/mob/living/simple_mob/animal/passive/dog/stray
|
||||
name = "dog"
|
||||
desc = "The most standard dog you have ever seen, it even smells like one."
|
||||
tt_desc = "Canis lupus familiaris"
|
||||
//faction = "mexico" //They are from Mexico. //Amusing but this prompts aggression from crew-aligned mobs.
|
||||
|
||||
icon = 'modular_chomp/icons/turf/desert_tiles.dmi'
|
||||
icon_state = "dog"
|
||||
item_state = "dog"
|
||||
icon_living = "dog"
|
||||
icon_rest = "dog"
|
||||
icon_dead = "dog"
|
||||
|
||||
health = 50
|
||||
maxHealth = 50
|
||||
|
||||
mob_size = MOB_SMALL
|
||||
pass_flags = PASSTABLE
|
||||
can_pull_size = ITEMSIZE_TINY
|
||||
can_pull_mobs = MOB_PULL_NONE
|
||||
layer = MOB_LAYER
|
||||
density = 1
|
||||
movement_cooldown = 0.75 //roughly a bit faster than a person
|
||||
|
||||
response_help = "pets"
|
||||
response_disarm = "rolls aside"
|
||||
response_harm = "stomps"
|
||||
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 7
|
||||
attacktext = list("nips", "bumps", "scratches")
|
||||
|
||||
vore_taste = "wet dog"
|
||||
|
||||
min_oxy = 16 //Require atleast 16kPA oxygen
|
||||
minbodytemp = 223 //Below -50 Degrees Celcius
|
||||
maxbodytemp = 523 //Above 80 Degrees Celcius
|
||||
heat_damage_per_tick = 3
|
||||
cold_damage_per_tick = 3
|
||||
|
||||
meat_amount = 7
|
||||
holder_type = /obj/item/weapon/holder/armadillo
|
||||
ai_holder_type = /datum/ai_holder/simple_mob/armadillo
|
||||
|
||||
speak_emote = list("rumbles", "chirr?", "churr")
|
||||
|
||||
say_list_type = /datum/say_list/armadillo
|
||||
@@ -20,6 +20,13 @@
|
||||
adminbus_trash = TRUE //You know what, sure whatever. It's not like anyone's gonna be taking this bird on unga trips to be their gamer backpack, which kinda was the main reason for the trash eater restrictions in the first place anyway.
|
||||
faction = "neutral"
|
||||
say_list_type = /datum/say_list/swoopie
|
||||
var/static/list/crew_creatures = list( /mob/living/simple_mob/protean_blob,
|
||||
/mob/living/simple_mob/slime/promethean)
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/IIsAlly(mob/living/L)
|
||||
. = ..()
|
||||
if(!.) // Outside the faction and not in friends, are they crew
|
||||
return L?.type in crew_creatures
|
||||
|
||||
/mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/init_vore()
|
||||
if(!voremob_loaded)
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
/datum/sprite_accessory/marking
|
||||
var/hide_body_parts = list()
|
||||
|
||||
/datum/sprite_accessory/marking/ch/anthrovirus_ra
|
||||
name = "Anthro Virus (Right Arm)"
|
||||
icon_state = "anthrovirus"
|
||||
@@ -181,4 +178,4 @@
|
||||
name = "Normal Eyes"
|
||||
icon_state = "normeyes"
|
||||
body_parts = list(BP_HEAD)
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
color_blend_mode = ICON_MULTIPLY
|
||||
|
||||
@@ -5,6 +5,130 @@
|
||||
/datum/sprite_accessory/tail/taur/wolf
|
||||
vore_tail_sprite_variant = "N"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch
|
||||
icon = 'icons/mob/vore/taurs_ch.dmi'//Parent which allows us to not need to set icon every time.
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/zorgoia
|
||||
name = "Zorgoia (Taur)"
|
||||
icon_state = "zorgoia"
|
||||
extra_overlay = "zorgoia_fluff"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/zorgoia/fat
|
||||
name = "Zorgoia (Fat Taur)"
|
||||
extra_overlay = "zorgoia_fat"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/redpanda
|
||||
name = "Red Panda (Taur)"
|
||||
icon_state = "redpanda"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/redpandadc
|
||||
name = "Red Panda (Taur dual-color)"
|
||||
icon_state = "redpanda_dc"
|
||||
extra_overlay = "redpanda_dc_markings"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/wolf/fatwolf_2c/fatwolfalt
|
||||
name = "Fat Wolf 3-color-alt (Taur)"
|
||||
icon_state = "fatwolfalt_s"
|
||||
extra_overlay = "fatwolfalt_markings1"
|
||||
extra_overlay2 = "fatwolfalt_markings2"
|
||||
icon_sprite_tag = "wolf"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/naga/alt
|
||||
name = "Naga alt (Taur)"
|
||||
icon_state = "naga_alt_s"
|
||||
suit_sprites = 'modular_chomp/icons/mob/taursuits_naga_ch.dmi'
|
||||
|
||||
msg_owner_help_walk = "You carefully slither around %prey."
|
||||
msg_prey_help_walk = "%owner's huge tail slithers past beside you!"
|
||||
|
||||
msg_owner_help_run = "You carefully slither around %prey."
|
||||
msg_prey_help_run = "%owner's huge tail slithers past beside you!"
|
||||
|
||||
msg_owner_disarm_run = "Your tail slides over %prey, pushing them down to the ground!"
|
||||
msg_prey_disarm_run = "%owner's tail slides over you, forcing you down to the ground!"
|
||||
|
||||
msg_owner_disarm_walk = "You push down on %prey with your tail, pinning them down under you!"
|
||||
msg_prey_disarm_walk = "%owner pushes down on you with their tail, pinning you down below them!"
|
||||
|
||||
msg_owner_harm_run = "Your heavy tail carelessly slides past %prey, crushing them!"
|
||||
msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their heavy tail!"
|
||||
|
||||
msg_owner_harm_walk = "Your heavy tail slowly and methodically slides down upon %prey, crushing against the floor below!"
|
||||
msg_prey_harm_walk = "%owner's thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!"
|
||||
|
||||
msg_owner_grab_success = "You slither over %prey with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!"
|
||||
msg_prey_grab_success = "%owner slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!"
|
||||
|
||||
msg_owner_grab_fail = "You squish %prey under your large, thick tail, forcing them onto the ground!"
|
||||
msg_prey_grab_fail = "%owner pins you under their large, thick tail, forcing you onto the ground!"
|
||||
|
||||
msg_prey_stepunder = "You jump over %prey's thick tail."
|
||||
msg_owner_stepunder = "%owner bounds over your tail."
|
||||
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/naga/alt_2c
|
||||
name = "Naga dual-color alt (Taur)"
|
||||
icon_state = "naga_alt_s"
|
||||
extra_overlay = "naga_alt_markings"
|
||||
suit_sprites = 'modular_chomp/icons/mob/taursuits_naga_ch.dmi'
|
||||
|
||||
msg_owner_help_walk = "You carefully slither around %prey."
|
||||
msg_prey_help_walk = "%owner's huge tail slithers past beside you!"
|
||||
|
||||
msg_owner_help_run = "You carefully slither around %prey."
|
||||
msg_prey_help_run = "%owner's huge tail slithers past beside you!"
|
||||
|
||||
msg_owner_disarm_run = "Your tail slides over %prey, pushing them down to the ground!"
|
||||
msg_prey_disarm_run = "%owner's tail slides over you, forcing you down to the ground!"
|
||||
|
||||
msg_owner_disarm_walk = "You push down on %prey with your tail, pinning them down under you!"
|
||||
msg_prey_disarm_walk = "%owner pushes down on you with their tail, pinning you down below them!"
|
||||
|
||||
msg_owner_harm_run = "Your heavy tail carelessly slides past %prey, crushing them!"
|
||||
msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their heavy tail!"
|
||||
|
||||
msg_owner_harm_walk = "Your heavy tail slowly and methodically slides down upon %prey, crushing against the floor below!"
|
||||
msg_prey_harm_walk = "%owner's thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!"
|
||||
|
||||
msg_owner_grab_success = "You slither over %prey with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!"
|
||||
msg_prey_grab_success = "%owner slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!"
|
||||
|
||||
msg_owner_grab_fail = "You squish %prey under your large, thick tail, forcing them onto the ground!"
|
||||
msg_prey_grab_fail = "%owner pins you under their large, thick tail, forcing you onto the ground!"
|
||||
|
||||
msg_prey_stepunder = "You jump over %prey's thick tail."
|
||||
msg_owner_stepunder = "%owner bounds over your tail."
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/horse/scoli
|
||||
name = "Scolipede (Taur)"
|
||||
icon_state = "scoli_s"
|
||||
extra_overlay = "scoli_markings1"
|
||||
extra_overlay2 = "scoli_markings2"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/sergal/wheaties
|
||||
name = "Sergal (Taur)"
|
||||
icon_state = "sergwheat"
|
||||
icon_sprite_tag = "wolf"
|
||||
vore_tail_sprite_variant = "N"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/sergal/fatwheaties
|
||||
name = "Fat Sergal (Taur)"
|
||||
icon_state = "fatsergal"
|
||||
icon_sprite_tag = "wolf"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/sergal/wheaties_2c
|
||||
name = "Sergal (Taur, dual-color)"
|
||||
icon_state = "sergwheat"
|
||||
extra_overlay = "sergwheat_markings"
|
||||
icon_sprite_tag = "wolf"
|
||||
vore_tail_sprite_variant = "N"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/sergal/fatwheaties_2c
|
||||
name = "Fat Sergal (Taur, dual-color)"
|
||||
icon_state = "fatsergal"
|
||||
extra_overlay = "sergwheat_markings"
|
||||
icon_sprite_tag = "wolf"
|
||||
|
||||
/datum/sprite_accessory/tail/taur/ch/longvirus
|
||||
name = "Long Virus (Taur)"
|
||||
icon_state = "longvirus_s"
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
/obj/item/organ/external
|
||||
var/prosthetic_digi = FALSE //CHOMPStation edit - when it's prosthetic, can it be a digitigrade
|
||||
|
||||
//new function to check for markings
|
||||
/obj/item/organ/external/proc/is_hidden_by_markings()
|
||||
//code that checked all limbs.
|
||||
|
||||
@@ -4,170 +4,86 @@
|
||||
// preferentially take digitigrade value from owner if available, THEN DNA.
|
||||
// this allows limbs to be set properly when being printed in the bioprinter without an owner
|
||||
// this also allows the preview mannequin to update properly because customisation topic calls don't call a DNA check
|
||||
var/check_digi = istype(src,/obj/item/organ/external/leg) || istype(src,/obj/item/organ/external/foot)
|
||||
if(owner)
|
||||
digitigrade = owner.digitigrade
|
||||
digitigrade = check_digi && owner.digitigrade
|
||||
else if(dna)
|
||||
digitigrade = dna.digitigrade
|
||||
digitigrade = check_digi && dna.digitigrade
|
||||
|
||||
if( !model && ( istype(src,/obj/item/organ/external/leg) || istype(src,/obj/item/organ/external/foot) ) ) //All leg icons go through here now.
|
||||
var/robotic_digi = prosthetic_digi && digitigrade //could make it so the prosthetic digi var is more of a "does this limb have a custom digitigrade sprite for its robospriting" but this is fine for now
|
||||
|
||||
var/gender = "m"
|
||||
if(owner && owner.gender == FEMALE)
|
||||
gender = "f"
|
||||
|
||||
if(!force_icon_key)
|
||||
icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit
|
||||
else
|
||||
icon_cache_key = "[icon_name]_[force_icon_key]"
|
||||
|
||||
if(force_icon)
|
||||
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]")
|
||||
else
|
||||
if(!dna)
|
||||
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]")
|
||||
else
|
||||
|
||||
if(!gendered_icon)
|
||||
gender = null
|
||||
else
|
||||
if(dna.GetUIState(DNA_UI_GENDER))
|
||||
gender = "f"
|
||||
else
|
||||
gender = "m"
|
||||
|
||||
if(skeletal)
|
||||
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
|
||||
else if (robotic >= ORGAN_ROBOT)
|
||||
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
|
||||
apply_colouration(mob_icon)
|
||||
else
|
||||
if(is_hidden_by_markings())
|
||||
mob_icon = new /icon('icons/mob/human_races/r_blank.dmi', "[icon_name][gender ? "_[gender]" : ""]")
|
||||
else
|
||||
//Use digi icon if digitigrade, otherwise use regular icon. Ternary operator is based.
|
||||
mob_icon = new /icon(digitigrade ? species.icodigi : species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
|
||||
apply_colouration(mob_icon)
|
||||
|
||||
//Code here is copied from organ_icon.dm line 118 at time of writing (9/20/21), VOREStation edits are left in intentionally, because I think it's worth keeping track of the fact that the code is from Virgo's edits.
|
||||
//Body markings, actually does not include head this time. Done separately above.
|
||||
if(!istype(src,/obj/item/organ/external/head))
|
||||
for(var/M in markings)
|
||||
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
|
||||
var/isdigitype = istype(mark_style,/datum/sprite_accessory/marking/digi)
|
||||
if(!(digitigrade ^ isdigitype)) //Equivalent to XNOR; this code will only run if either both digitigrade and isdigitype are true, or if both are false.
|
||||
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
|
||||
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
|
||||
add_overlay(mark_s) //So when it's not on your body, it has icons
|
||||
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
|
||||
icon_cache_key += "[M][markings[M]["color"]]"
|
||||
if(body_hair && islist(h_col) && h_col.len >= 3)
|
||||
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
|
||||
if(!limb_icon_cache[cache_key])
|
||||
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
|
||||
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
|
||||
limb_icon_cache[cache_key] = I
|
||||
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
|
||||
|
||||
// VOREStation edit start
|
||||
if(nail_polish)
|
||||
var/icon/I = new(nail_polish.icon, nail_polish.icon_state)
|
||||
I.Blend(nail_polish.color, ICON_MULTIPLY)
|
||||
add_overlay(I)
|
||||
mob_icon.Blend(I, ICON_OVERLAY)
|
||||
icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]"
|
||||
// VOREStation edit end
|
||||
dir = EAST
|
||||
icon = mob_icon
|
||||
return mob_icon
|
||||
var/gender = "m"
|
||||
if(owner && owner.gender == FEMALE)
|
||||
gender = "f"
|
||||
|
||||
if(!force_icon_key)
|
||||
icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit
|
||||
else
|
||||
//. = ..()
|
||||
//due to the wierd fact that this calls the old code, and defining it here makes a duplicate procedure error, i'm gonna have to bring the whole code here and modify it. if there is a more condensed way, it is appreciated.
|
||||
icon_cache_key = "[icon_name]_[force_icon_key]"
|
||||
|
||||
var/gender = "m"
|
||||
if(owner && owner.gender == FEMALE)
|
||||
gender = "f"
|
||||
|
||||
if(!force_icon_key)
|
||||
icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit
|
||||
if(force_icon && !robotic_digi)
|
||||
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]")
|
||||
else
|
||||
if(!dna)
|
||||
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]")
|
||||
else
|
||||
icon_cache_key = "[icon_name]_[force_icon_key]"
|
||||
|
||||
if(force_icon)
|
||||
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]")
|
||||
else
|
||||
if(!dna)
|
||||
mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]")
|
||||
if(!gendered_icon)
|
||||
gender = null
|
||||
else
|
||||
if(!gendered_icon)
|
||||
gender = null
|
||||
if(dna.GetUIState(DNA_UI_GENDER))
|
||||
gender = "f"
|
||||
else
|
||||
if(dna.GetUIState(DNA_UI_GENDER))
|
||||
gender = "f"
|
||||
else
|
||||
gender = "m"
|
||||
gender = "m"
|
||||
|
||||
if(skeletal)
|
||||
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
|
||||
else if (robotic >= ORGAN_ROBOT)
|
||||
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
|
||||
if(skeletal)
|
||||
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
|
||||
else if (robotic >= ORGAN_ROBOT && !robotic_digi)
|
||||
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
|
||||
apply_colouration(mob_icon)
|
||||
else
|
||||
if(is_hidden_by_markings())
|
||||
mob_icon = new /icon('icons/mob/human_races/r_blank.dmi', "[icon_name][gender ? "_[gender]" : ""]")
|
||||
else
|
||||
//Use digi icon if digitigrade, otherwise use regular icon. Ternary operator is based.
|
||||
mob_icon = new /icon(digitigrade ? species.icodigi : species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
|
||||
apply_colouration(mob_icon)
|
||||
else
|
||||
if(is_hidden_by_markings())
|
||||
mob_icon = new /icon('icons/mob/human_races/r_blank.dmi', "[icon_name][gender ? "_[gender]" : ""]")
|
||||
else
|
||||
//Use digi icon if digitigrade, otherwise use regular icon. Ternary operator is based.
|
||||
mob_icon = new /icon(species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
|
||||
apply_colouration(mob_icon)
|
||||
|
||||
//Body markings, actually does not include head this time. Done separately above.
|
||||
if(!istype(src,/obj/item/organ/external/head))
|
||||
for(var/M in markings)
|
||||
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
|
||||
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
|
||||
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
|
||||
add_overlay(mark_s) //So when it's not on your body, it has icons
|
||||
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
|
||||
icon_cache_key += "[M][markings[M]["color"]]"
|
||||
if (model && !robotic_digi)
|
||||
icon_cache_key += "_model_[model]"
|
||||
apply_colouration(mob_icon)
|
||||
|
||||
if(body_hair && islist(h_col) && h_col.len >= 3)
|
||||
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
|
||||
if(!limb_icon_cache[cache_key])
|
||||
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
|
||||
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
|
||||
limb_icon_cache[cache_key] = I
|
||||
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
|
||||
//Code here is copied from organ_icon.dm line 118 at time of writing (9/20/21), VOREStation edits are left in intentionally, because I think it's worth keeping track of the fact that the code is from Virgo's edits.
|
||||
//Body markings, actually does not include head this time. Done separately above.
|
||||
if((!istype(src,/obj/item/organ/external/head) && !(force_icon && !robotic_digi)) || (model && owner && owner.synth_markings))
|
||||
for(var/M in markings)
|
||||
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
|
||||
var/isdigitype = mark_style.digitigrade_acceptance
|
||||
if(check_digi)
|
||||
if (!(isdigitype & (digitigrade ? MARKING_DIGITIGRADE_ONLY : MARKING_NONDIGI_ONLY))) //checks flags based on which digitigrade type the limb is
|
||||
continue
|
||||
var/icon/mark_s = new/icon("icon" = digitigrade ? mark_style.digitigrade_icon : mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
|
||||
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
|
||||
add_overlay(mark_s) //So when it's not on your body, it has icons
|
||||
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
|
||||
icon_cache_key += "[M][markings[M]["color"]]"
|
||||
if(body_hair && islist(h_col) && h_col.len >= 3)
|
||||
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
|
||||
if(!limb_icon_cache[cache_key])
|
||||
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
|
||||
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
|
||||
limb_icon_cache[cache_key] = I
|
||||
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
|
||||
|
||||
// VOREStation edit start
|
||||
if(nail_polish)
|
||||
var/icon/I = new(nail_polish.icon, nail_polish.icon_state)
|
||||
I.Blend(nail_polish.color, ICON_MULTIPLY)
|
||||
add_overlay(I)
|
||||
mob_icon.Blend(I, ICON_OVERLAY)
|
||||
icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]"
|
||||
// VOREStation edit end
|
||||
// VOREStation edit start
|
||||
if(nail_polish && (force_icon && !robotic_digi))
|
||||
var/icon/I = new(nail_polish.icon, nail_polish.icon_state)
|
||||
I.Blend(nail_polish.color, ICON_MULTIPLY)
|
||||
add_overlay(I)
|
||||
mob_icon.Blend(I, ICON_OVERLAY)
|
||||
icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]"
|
||||
// VOREStation edit end
|
||||
|
||||
if(model)
|
||||
icon_cache_key += "_model_[model]"
|
||||
apply_colouration(mob_icon)
|
||||
if(owner && owner.synth_markings)
|
||||
for(var/M in markings)
|
||||
var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"]
|
||||
var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]")
|
||||
mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit
|
||||
add_overlay(mark_s) //So when it's not on your body, it has icons
|
||||
mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons
|
||||
icon_cache_key += "[M][markings[M]["color"]]"
|
||||
|
||||
if(body_hair && islist(h_col) && h_col.len >= 3)
|
||||
var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]"
|
||||
if(!limb_icon_cache[cache_key])
|
||||
var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]")
|
||||
I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit
|
||||
limb_icon_cache[cache_key] = I
|
||||
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
|
||||
// VOREStation edit ends here
|
||||
|
||||
dir = EAST
|
||||
icon = mob_icon
|
||||
return mob_icon
|
||||
dir = EAST
|
||||
icon = mob_icon
|
||||
return mob_icon
|
||||
|
||||
81
modular_chomp/code/modules/player_tips/player_tips_list.dm
Normal file
81
modular_chomp/code/modules/player_tips/player_tips_list.dm
Normal file
@@ -0,0 +1,81 @@
|
||||
/* List of player tips
|
||||
Weighted to emphasize more important over less.area
|
||||
Weights are not additive. You can have multiple prob(50) items.
|
||||
prob(50) makes it half as likely to appear and so forth.
|
||||
When editing the list, please try and keep similar probabilities near each other. High on top, low on bottom */
|
||||
|
||||
//argument determines if to pick a random tip or use a forced choice.
|
||||
/datum/player_tips/proc/pick_tip(var/isSpecific)
|
||||
var/choice = null
|
||||
if(!(isSpecific == "none" || isSpecific == "general" || isSpecific == "gameplay" || isSpecific == "roleplay" || isSpecific == "lore" ))
|
||||
choice = "none" //Making sure that wrong arguments still give tips.
|
||||
if(isSpecific == "none")
|
||||
choice = pick (
|
||||
prob(50); "general",
|
||||
prob(50); "gameplay",
|
||||
prob(25); "roleplay",
|
||||
prob(20); "lore"
|
||||
)
|
||||
else
|
||||
choice = isSpecific
|
||||
|
||||
switch(choice)
|
||||
if("general")
|
||||
var/info = "The following is a general tip to playing on CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of character setup! \n"
|
||||
return pick(
|
||||
prob(60); "[info] Got a question about gameplay, roleplay or the setting? Press F1 to Mentorhelp!",
|
||||
prob(60); "[info] We have a wiki that is actively updated! Please check it out at https://wiki.chompstation13.net/index.php/Chomp_Station_Wiki for help!",
|
||||
prob(60); "[info] Unsure about rules? Press F1 and ask our admins for clarification - they are happy to help.",
|
||||
prob(30); "[info] Don't be afraid to approach your fellow players for advice! Learning things ICly can help build powerful bonds!",
|
||||
prob(30); "[info] Need some guideance making a character or with roleplay concepts? Our discord's tutoring channel is happy to help!",
|
||||
prob(30); "[info] Having difficulties getting started? Pressing F3 to speak and typing '; Hello! I'm a new hire. Could someone please give me a tour?' or as appropriate for your character is a good way to start! More help available at: https://wiki.chompstation13.net/index.php/The_Basics",
|
||||
prob(30); "[info] Want to try out a new department? Consider joining as an intern when it's well-staffed. Our players enjoy teaching eager students. You can approach such roleplay as simply getting taught the local technologies, procedures - you don't need to be 'fresh out of school' to justify it!",
|
||||
prob(30); "[info] Our discord is an excellent resource to stay up to date about changes and events! If wanting to separate your kink and real identities, Discord has a built in means to swap accounts within the client. It is OK to lurk!",
|
||||
prob(5); "[info] Got another tip for the list? Please let us know on Discord in the feedback forums!"
|
||||
)
|
||||
|
||||
|
||||
if("gameplay")
|
||||
var/info = "The following is a gameplay-focused tip to playing on CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of character setup! \n"
|
||||
return pick(
|
||||
prob(50); "[info] To talk to your fellow coworkers, use ';'! You may append it by an exclamation mark, like ';!' to perform an audiable emote. ",
|
||||
prob(50); "[info] Lost on the map? You can find In-Character help by speaking on the Common Radio. You can do this by pressing F3 and typing ' ; ' before your message. Your fellow co-workers will likely help. If OOC help is preferred, press F1 for mentorhelp. ",
|
||||
prob(50); "[info] You may set your suit sensors by clicking on the icon in the bottom left corner, then right click the clothes that appear right above it. It is recommended to turn on suit sensors to 'TRACKING' before doing anything dangerous like mining, and to turn them off before digestion scenes as prey.",
|
||||
prob(35); "[info] It is never a bad idea to visit the medbay if you get injured - small burns and cuts can get infected and become harder to treat! If there is no medical staff, bathrooms and the bar often has a NanoMed on the wall while a medical station can be found on the first deck - with ointments to disinfect cuts and burns, bandages to treat bruises and encourage healing.",
|
||||
prob(25); "[info] Two control modes exist for SS13 - hotkey ON and hotkey OFF. You can swap between the two modes by pressing TAB. In hotkey mode, to chat you need to press T to say anything which creates a small talking bubble.",
|
||||
prob(25); "[info] Do you want to shift your character around, for instance to appear as if leaning on the wall? Press CTRL + SHIFT + arrow keys to do so! Moving resets this.",
|
||||
prob(25); "[info] Emergency Fire Doors seal breaches and keep active fires out. Please do not open them without good reason. SHIFT + CLICK them to get temperature and atmospheric pressure readings.",
|
||||
prob(25); "[info] The kitchen's Oven can fit multiple ingredients in one slot if you pull the baking tray out first. This is required for most recipes, and the Grille and Deep Frier work the same way!",
|
||||
prob(10); "[info] Not every hostile NPC you encounter while mining or exploring need to be defeated. Sometimes, it's better to avoid or run away from them.",
|
||||
prob(1); "[info] Stay robust, my friends.",
|
||||
prob(35); "[info] You can insert your I.D into your PDA. This frees up your belt from having to carry your PDA. Furthermore, by clicking and dragging the PDA to game screen, you can use it without holding it!",
|
||||
prob(35); "[info] Your vore-bellies have multiple add-ons! Muffling is excellent to ensure your prey does not accidentally inform everyone about their predicament, and jam suit sensors is a great courtesy to avoid medical being worried about your prey!"
|
||||
)
|
||||
|
||||
if("roleplay")
|
||||
var/info = "The following is a roleplay-focused tip to playing on CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of character setup! \n"
|
||||
return pick(
|
||||
prob(50); "[info] Having difficulty finding scenes? The number one tip that people should take for finding scenes is to be active! Generally speaking, people are more likely to interact with you if you are moving about and doing things. Don't be afraid to talk to people, you're less likely to be approached if you're sat alone at a table silently. People that are looking for scenes generally like to see how you type and RP before they'll start working towards a scene with you.",
|
||||
prob(50); "[info] Please avoid a character that knows everything. Having only a small set of jobs you are capable of doing can help flesh out your character! It's OK for things to break and fail if nobody is around to fix it - you do not need to do others' jobs.",
|
||||
prob(25); "[info] Embrace the limits of your character's skillsets! Seeking out other players to help you with a more challenging task might build friendships, or even lead to a scene!",
|
||||
prob(25); "[info] Slowing down when meeting another player can help with finding roleplay! Your fellow player might be typing up a greeting or an emote, and if you run off you won't see it!",
|
||||
prob(25); "[info] It is a good idea to wait a few moments after using mechanics like lick, hug or headpat on another player. They might be typing up a response or wish to reciprocate, and if you run away you might miss out!",
|
||||
prob(25); "[info] Participating in an away mission and see something acting strange? Try emoting or talking to it before resorting to fighting. It may be a GM event!",
|
||||
prob(15); "[info] We are a medium roleplay server. This does not neccessarily mean 'serious' roleplay, levity and light-hearted RP is more than welcome! Please do not ignore people just because it is unlikely you will be able to scene.",
|
||||
prob(10); "[info] Sending faxes to central command, using the 'pray' verb or pressing F1 to ahelp are highly encouraged when exploring the gateway or overmap locations! Letting GMs know something fun is happening allows them to spice things up and make the world feel alive!",
|
||||
prob(40); "[info] Just because you see something doesn't mean your character has to. A courtesy 'missing' of contraband or scene details can go a long way towards preserving everyone's fun!",
|
||||
prob(25); "[info] It is always a good idea to communicate on your department's private channel (whose key you can learn by examining your headset) when responding to an emergency! This lets your coworkers know if they might be needed!",
|
||||
prob(25); "[info] While following the SOP is not mandatory, and you are free to break it (albeit, with potential in-character consequences), departments like security and medical do well to be familiar with them! https://wiki.chompstation13.net/index.php/Standard_Operating_Procedure",
|
||||
prob(25); "[info] Think a player is acting especially antagonistic? It might be better to Ahelp (with F1) rather than try to deal with it icly, staff can make sure it's all okay.",
|
||||
prob(20); "[info] See a minor infraction as Security with a minimal time punishment? Consider using your ticket printer to give a non obtrusive punishment."
|
||||
)
|
||||
|
||||
if("lore")
|
||||
var/info = "The following is tip for understanding the lore of CHOMPStation! You can disable them using the periodic tips toggle in the Global tab of character setup! \n"
|
||||
return pick(
|
||||
prob(25); "[info] Our lore is somewhat in line with other servers. But not Virgo's. They wrote themselves out of the timeline, lol. The year is 2564 (current year+541).",
|
||||
prob(75); "[info] You can find a short summary of our setting that everyone should know at https://wiki.chompstation13.net/index.php/Lore",
|
||||
prob(50); "[info] You are currently working in the Vir system on the NLS Southern Cross telecommunications and traffic control station. https://wiki.chompstation13.net/index.php/Vir",
|
||||
prob(50); "[info] The majority of employees live at the Northern Star asteroid colony orbiting a gas giant called Kara. It is also a central hub for visitors, logistics, and mining. This is the place the shuttle takes you at the end of the round. You may visit the mines via the exploration shuttles. https://wiki.chompstation13.net/index.php/NCS_Northern_Star",
|
||||
prob(10); "[info] Thaler is a universal monopoly money. It is backed and supported by Sol Central and its allies. While ubiquitous in frontier worlds, it has an unfavourable exchange rate with most currencies used by well-settled regions, limiting immigration to places such as Earth. https://wiki.chompstation13.net/index.php/Lore"
|
||||
)
|
||||
@@ -3,7 +3,7 @@
|
||||
desc = "Stuff it with paper and shoot! You'll be a hit at every party."
|
||||
id = "confetti_cannon"
|
||||
req_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000)
|
||||
materials = list(MAT_STEEL = 3000, MAT_GLASS = 3000)
|
||||
build_path = /obj/item/weapon/gun/launcher/confetti_cannon
|
||||
sort_string = "MAAVD"
|
||||
|
||||
@@ -11,34 +11,71 @@
|
||||
/datum/design/item/weapon/phase/phase_pistol
|
||||
id = "phasepistol"
|
||||
req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2, TECH_POWER = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 4000, MAT_COPPER = 30)
|
||||
materials = list(MAT_STEEL = 4000, MAT_GLASS = 500)
|
||||
build_path = /obj/item/weapon/gun/energy/locked/phasegun/pistol
|
||||
sort_string = "MACAA"
|
||||
|
||||
/datum/design/item/weapon/phase/phase_carbine
|
||||
id = "phasecarbine"
|
||||
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_POWER = 2)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 6000, "glass" = 1500, MAT_COPPER = 40)
|
||||
materials = list(MAT_STEEL = 6000, MAT_GLASS = 500)
|
||||
build_path = /obj/item/weapon/gun/energy/locked/phasegun
|
||||
sort_string = "MACAB"
|
||||
|
||||
/datum/design/item/weapon/phase/phase_rifle
|
||||
id = "phaserifle"
|
||||
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 7000, "glass" = 2000, "silver" = 500)
|
||||
materials = list(MAT_STEEL = 7000, MAT_GLASS = 500, MAT_SILVER = 500)
|
||||
build_path = /obj/item/weapon/gun/energy/locked/phasegun/rifle
|
||||
sort_string = "MACAC"
|
||||
|
||||
/datum/design/item/weapon/phase/phase_cannon
|
||||
id = "phasecannon"
|
||||
req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 4, TECH_POWER = 4)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 10000, "glass" = 2000, "silver" = 1000, "diamond" = 750)
|
||||
materials = list(MAT_STEEL = 10000, MAT_GLASS = 2000, MAT_SILVER = 2000, MAT_DIAMOND = 750)
|
||||
build_path = /obj/item/weapon/gun/energy/locked/phasegun/cannon
|
||||
sort_string = "MACAD"
|
||||
|
||||
/datum/design/item/weapon/phase/frontier_holdout
|
||||
id = "holdout frontier phaser"
|
||||
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 7, TECH_MATERIAL = 6, TECH_PHORON = 6)
|
||||
materials = list(MAT_STEEL = 6000, MAT_GLASS = 900, MAT_DURASTEEL = 100, MAT_METALHYDROGEN = 150, MAT_VERDANTIUM = 100, MAT_PHORON = 1000)
|
||||
build_path = /obj/item/weapon/gun/energy/locked/frontier/holdout
|
||||
sort_string = "MACAE"
|
||||
|
||||
/datum/design/item/weapon/phase/frontier_phaser
|
||||
id = "frontier phaser"
|
||||
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 7, TECH_MATERIAL = 6, TECH_PHORON = 6)
|
||||
materials = list(MAT_STEEL = 7000, MAT_GLASS = 900, MAT_DURASTEEL = 100, MAT_METALHYDROGEN = 200, MAT_VERDANTIUM = 150, MAT_PHORON = 2000)
|
||||
build_path = /obj/item/weapon/gun/energy/locked/frontier
|
||||
sort_string = "MACAF"
|
||||
|
||||
/datum/design/item/weapon/phase/frontier_carbine
|
||||
id = "carbine frontier phaser"
|
||||
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 8, TECH_MATERIAL = 6, TECH_PHORON = 6)
|
||||
materials = list(MAT_STEEL = 6500, MAT_GLASS = 900, MAT_DURASTEEL = 150, MAT_METALHYDROGEN = 250, MAT_VERDANTIUM = 200, MAT_PHORON = 4000)
|
||||
build_path = /obj/item/weapon/gun/energy/locked/frontier/carbine
|
||||
sort_string = "MACAG"
|
||||
|
||||
/datum/design/item/weapon/phase/frontier_rifle
|
||||
id = "marksman rifle frontier phaser"
|
||||
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 7, TECH_MATERIAL = 6, TECH_PHORON = 6)
|
||||
materials = list(MAT_STEEL = 8000, MAT_GLASS = 900, MAT_DURASTEEL = 200, MAT_METALHYDROGEN = 300, MAT_VERDANTIUM = 250, MAT_PHORON = 2000)
|
||||
build_path = /obj/item/weapon/gun/energy/locked/frontier/rifle
|
||||
sort_string = "MACAH"
|
||||
|
||||
/datum/design/item/weapon/phase/frontier_handbow
|
||||
id = "handbow frontier phaser"
|
||||
req_tech = list(TECH_COMBAT = 4, TECH_POWER = 7, TECH_MATERIAL = 6, TECH_PHORON = 6)
|
||||
materials = list(MAT_STEEL = 5000, MAT_GLASS = 900, MAT_DURASTEEL = 100, MAT_METALHYDROGEN = 200, MAT_VERDANTIUM = 150, MAT_PHORON = 1000)
|
||||
build_path = /obj/item/weapon/gun/energy/locked/frontier/handbow
|
||||
sort_string = "MACAI"
|
||||
|
||||
//Leathals And any new CHOMP weapons.
|
||||
/datum/design/item/weapon/gun/projectile/caseless/prototype
|
||||
id = "caselessrifle"
|
||||
req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5, TECH_PHORON = 5)
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 7000, "titanium" = 4000)
|
||||
materials = list(MAT_STEEL = 7000, MAT_TITANIUM = 4000)
|
||||
build_path = /obj/item/weapon/gun/projectile/caseless/prototype
|
||||
sort_string = "MACAE"
|
||||
sort_string = "MACBA"
|
||||
|
||||
|
||||
@@ -6,9 +6,8 @@
|
||||
// And optionally, this could be gated behind another preference, to prevent stunlock being abused.
|
||||
if((mob_always_swap || (a_intent == I_HELP || src.restrained()) && (target.a_intent == I_HELP || target.restrained())) && target.canmove && target.handle_micro_bump_helping(src))
|
||||
return
|
||||
else if(!(target.a_intent == I_HELP || target.restrained()) && target.handle_micro_bump_other(src))
|
||||
if(!(target.a_intent == I_HELP || target.restrained()))
|
||||
if(src.step_mechanics_pref && target.step_mechanics_pref)
|
||||
target.handle_micro_bump_other(src)
|
||||
else
|
||||
target.handle_micro_bump_other(src, 1)
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user