Merge branch 'master' of https://github.com/ParadiseSS13/Paradise into OrganRefactor

This commit is contained in:
Aurorablade
2016-02-13 06:37:49 -05:00
53 changed files with 503 additions and 212 deletions
+5 -7
View File
@@ -15,13 +15,11 @@
if (isarea(A))
return A
/proc/get_area(O)
if(isarea(O))
return O
var/turf/loc = get_turf(O)
if(loc)
var/area/res = loc.loc
.= res
/proc/get_area(atom/A)
if(!istype(A))
return
for(A, A && !isarea(A), A=A.loc); //semicolon is for the empty statement
return A
/proc/get_area_name(N) //get area by its name
for(var/area/A in world)
+81
View File
@@ -0,0 +1,81 @@
var/global/datum/controller/process/timer/PStimer
/datum/controller/process/timer
var/list/processing_timers = list()
var/list/hashes = list()
/datum/controller/process/timer/setup()
name = "timer"
schedule_interval = 5 //every 0.5 seconds
PStimer = src
/datum/controller/process/timer/statProcess()
..()
stat(null, "[processing_timers.len] timers")
/datum/controller/process/timer/doWork()
if(!processing_timers.len)
disabled = 1 //nothing to do, lets stop firing.
return
for(last_object in processing_timers)
var/datum/timedevent/event = last_object
if(!event.thingToCall || qdeleted(event.thingToCall))
qdel(event)
if(event.timeToRun <= world.time)
runevent(event)
qdel(event)
SCHECK
/datum/controller/process/timer/proc/runevent(datum/timedevent/event)
set waitfor = 0
call(event.thingToCall, event.procToCall)(arglist(event.argList))
/datum/timedevent
var/thingToCall
var/procToCall
var/timeToRun
var/argList
var/id
var/hash
var/static/nextid = 1
/datum/timedevent/New()
id = nextid
nextid++
/datum/timedevent/Destroy()
PStimer.processing_timers -= src
PStimer.hashes -= hash
return QDEL_HINT_IWILLGC
/proc/addtimer(thingToCall, procToCall, wait, unique = FALSE, ...)
if(!PStimer) //can't run timers before the mc has been created
return
if(!thingToCall || !procToCall || wait <= 0)
return
if(PStimer.disabled)
PStimer.disabled = 0
var/datum/timedevent/event = new()
event.thingToCall = thingToCall
event.procToCall = procToCall
event.timeToRun = world.time + wait
event.hash = list2text(args)
if(args.len > 4)
event.argList = args.Copy(5)
// Check for dupes if unique = 1.
if(unique)
if(event.hash in PStimer.hashes)
return
// If we are unique (or we're not checking that), add the timer and return the id.
PStimer.processing_timers += event
PStimer.hashes += event.hash
return event.id
/proc/deltimer(id)
for(var/datum/timedevent/event in PStimer.processing_timers)
if(event.id == id)
qdel(event)
return 1
return 0
+2 -2
View File
@@ -135,7 +135,7 @@
var/comms_password = ""
var/use_irc_bot = 0
var/irc_bot_host = ""
var/list/irc_bot_host = list()
var/main_irc = ""
var/admin_irc = ""
var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix
@@ -458,7 +458,7 @@
config.comms_password = value
if("irc_bot_host")
config.irc_bot_host = value
config.irc_bot_host = text2list(value, ";")
if("main_irc")
config.main_irc = value
+94 -46
View File
@@ -5,6 +5,8 @@
var/current_target = null
var/temporary = 0
var/datum/martial_art/base = null // The permanent style
var/deflection_chance = 0 //Chance to deflect projectiles
var/help_verb = null
/datum/martial_art/proc/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
return 0
@@ -25,29 +27,32 @@
return
/datum/martial_art/proc/basic_hit(var/mob/living/carbon/human/A,var/mob/living/carbon/human/D)
add_logs(D, A, "punched")
A.do_attack_animation(D)
var/damage = rand(0,9)
var/atk_verb = "punch"
A.do_attack_animation(D)
var/damage = rand(A.species.punchdamagelow, A.species.punchdamagehigh)
var/datum/unarmed_attack/attack = A.species.unarmed
var/atk_verb = "[pick(attack.attack_verb)]"
if(D.lying)
atk_verb = "kick"
if(!damage)
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
playsound(D.loc, attack.miss_sound, 25, 1, -1)
D.visible_message("<span class='warning'>[A] has attempted to [atk_verb] [D]!</span>")
return 0
var/obj/item/organ/external/affecting = D.get_organ(ran_zone(A.zone_sel.selecting))
var/armor_block = D.run_armor_check(affecting, "melee")
playsound(D.loc, 'sound/weapons/punch1.ogg', 25, 1, -1)
playsound(D.loc, attack.attack_sound, 25, 1, -1)
D.visible_message("<span class='danger'>[A] has [atk_verb]ed [D]!</span>", \
"<span class='userdanger'>[A] has [atk_verb]ed [D]!</span>")
D.apply_damage(damage, BRUTE, affecting, armor_block)
if((D.stat != DEAD) && damage >= 9)
add_logs(D, A, "punched")
if((D.stat != DEAD) && damage >= A.species.punchstunthreshold)
D.visible_message("<span class='danger'>[A] has weakened [D]!!</span>", \
"<span class='userdanger'>[A] has weakened [D]!</span>")
D.apply_effect(4, WEAKEN, armor_block)
@@ -57,6 +62,8 @@
return 1
/datum/martial_art/proc/teach(var/mob/living/carbon/human/H,var/make_temporary=0)
if(help_verb)
H.verbs += help_verb
if(make_temporary)
temporary = 1
if(H.martial_art && H.martial_art.temporary)
@@ -71,30 +78,31 @@
if(H.martial_art != src)
return
H.martial_art = base
if(help_verb)
H.verbs -= help_verb
/datum/martial_art/boxing
name = "Boxing"
/datum/martial_art/boxing/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
A << "<span class='warning'> Can't disarm while boxing!</span>"
A << "<span class='warning'>Can't disarm while boxing!</span>"
return 1
/datum/martial_art/boxing/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
A << "<span class='warning'> Can't grab while boxing!</span>"
A << "<span class='warning'>Can't grab while boxing!</span>"
return 1
/datum/martial_art/boxing/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_logs(D, A, "punched")
A.do_attack_animation(D)
var/atk_verb = pick("left hook","right hook","straight punch")
var/damage = rand(5,8)
var/damage = rand(5, 8) + A.species.punchdamagelow
if(!damage)
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
D.visible_message("<span class='warning'>[A] has attempted to hit [D] with a [atk_verb]!</span>")
add_logs(D, A, "attempted to hit", atk_verb)
return 0
@@ -103,11 +111,11 @@
playsound(D.loc, 'sound/weapons/punch1.ogg', 25, 1, -1)
D.visible_message("<span class='danger'>[A] has hit [D] with a [atk_verb]!</span>", \
"<span class='userdanger'>[A] has hit [D] with a [atk_verb]!</span>")
D.apply_damage(damage, STAMINA, affecting, armor_block)
add_logs(D, A, "punched")
if(D.getStaminaLoss() > 50)
var/knockout_prob = D.getStaminaLoss() + rand(-15,15)
if((D.stat != DEAD) && prob(knockout_prob))
@@ -182,6 +190,12 @@
/datum/martial_art/wrestling
name = "Wrestling"
help_verb = /mob/living/carbon/human/proc/wrestling_help
// combo refence since wrestling uses a different format to sleeping carp and plasma fist.
// Clinch "G"
// Suplex "GD"
// Advanced grab "G"
/datum/martial_art/wrestling/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
D.grabbedby(A,1)
@@ -197,13 +211,15 @@
/datum/martial_art/wrestling/proc/Suplex(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_logs(D, A, "suplexed")
D.visible_message("<span class='danger'>[A] suplexes [D]!</span>", \
"<span class='userdanger'>[A] suplexes [D]!</span>")
D.forceMove(A.loc)
var/armor_block = D.run_armor_check(null, "melee")
D.apply_damage(30, BRUTE, null, armor_block)
D.apply_effect(6, WEAKEN, armor_block)
add_logs(D, A, "suplexed")
A.SpinAnimation(10,1)
D.SpinAnimation(10,1)
@@ -230,12 +246,24 @@
D.apply_damage(10, STAMINA, affecting, armor_block)
return 1
/mob/living/carbon/human/proc/wrestling_help()
set name = "Recall Teachings"
set desc = "Remember how to wrestle."
set category = "Wrestling"
usr << "<b><i>You flex your muscles and have a revelation...</i></b>"
usr << "<span class='notice'>Clinch</span>: Grab. Passively gives you a chance to immediately aggressively grab someone. Not always successful."
usr << "<span class='notice'>Suplex</span>: Disarm someone you are grabbing. Suplexes your target to the floor. Greatly injures them and leaves both you and your target on the floor."
usr << "<span class='notice'>Advanced grab</span>: Grab. Passively causes stamina damage when grabbing someone."
#define TORNADO_COMBO "HHD"
#define THROWBACK_COMBO "DHD"
#define PLASMA_COMBO "HDDDH"
/datum/martial_art/plasma_fist
name = "Plasma Fist"
help_verb = /mob/living/carbon/human/proc/plasma_fist_help
/datum/martial_art/plasma_fist/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(findtext(streak,TORNADO_COMBO))
@@ -271,7 +299,7 @@
"<span class='userdanger'>[A] has hit [D] with Plasma Punch!</span>")
playsound(D.loc, 'sound/weapons/punch1.ogg', 50, 1, -1)
var/atom/throw_target = get_edge_target_turf(D, get_dir(D, get_step_away(D, A)))
D.throw_at(throw_target, 200, 4)
D.throw_at(throw_target, 200, 4,A)
A.say("HYAH!")
return
@@ -285,26 +313,37 @@
return
/datum/martial_art/plasma_fist/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_to_streak("H")
add_to_streak("H",D)
if(check_streak(A,D))
return 1
basic_hit(A,D)
return 1
/datum/martial_art/plasma_fist/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_to_streak("D")
add_to_streak("D",D)
if(check_streak(A,D))
return 1
basic_hit(A,D)
return 1
/datum/martial_art/plasma_fist/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_to_streak("G")
add_to_streak("G",D)
if(check_streak(A,D))
return 1
basic_hit(A,D)
return 1
/mob/living/carbon/human/proc/plasma_fist_help()
set name = "Recall Teachings"
set desc = "Remember the martial techniques of the Plasma Fist."
set category = "Plasma Fist"
usr << "<b><i>You clench your fists and have a flashback of knowledge...</i></b>"
usr << "<span class='notice'>Tornado Sweep</span>: Harm Harm Disarm. Repulses target and everyone back."
usr << "<span class='notice'>Throwback</span>: Disarm Harm Disarm. Throws the target and an item at them."
usr << "<span class='notice'>The Plasma Fist</span>: Harm Disarm Disarm Disarm Harm. Knocks the brain out of the opponent and gibs their body."
//Used by the gang of the same name. Uses combos. Basic attacks bypass armor and never miss
#define WRIST_WRENCH_COMBO "DD"
#define BACK_KICK_COMBO "HG"
#define STOMACH_KNEE_COMBO "GH"
@@ -312,6 +351,8 @@
#define ELBOW_DROP_COMBO "HDHDH"
/datum/martial_art/the_sleeping_carp
name = "The Sleeping Carp"
deflection_chance = 100
help_verb = /mob/living/carbon/human/proc/sleeping_carp_help
/datum/martial_art/the_sleeping_carp/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(findtext(streak,WRIST_WRENCH_COMBO))
@@ -344,7 +385,7 @@
D.emote("scream")
D.drop_item()
D.apply_damage(5, BRUTE, pick("l_arm", "r_arm"))
D.Stun(1)
D.Stun(3)
return 1
return basic_hit(A,D)
@@ -375,7 +416,8 @@
"<span class='userdanger'>[A] kicks you in the jaw!</span>")
D.apply_damage(20, BRUTE, "head")
D.drop_item()
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
D.Stun(4)
return 1
return basic_hit(A,D)
@@ -386,32 +428,36 @@
if(D.stat)
D.death() //FINISH HIM!
D.apply_damage(50, BRUTE, "chest")
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 100, 1, -1)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1)
return 1
return basic_hit(A,D)
/datum/martial_art/the_sleeping_carp/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_to_streak("G")
add_to_streak("G",D)
if(check_streak(A,D))
return 1
..()
D.grabbedby(A,1)
var/obj/item/weapon/grab/G = A.get_active_hand()
if(G)
G.state = GRAB_AGGRESSIVE //Instant aggressive grab
/datum/martial_art/the_sleeping_carp/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_to_streak("H")
/datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
add_to_streak("H",D)
if(check_streak(A,D))
return 1
D.visible_message("<span class='danger'>[A] [pick("punches", "kicks", "chops", "hits", "slams")] [D]!</span>", \
"<span class='userdanger'>[A] hits you!</span>")
D.apply_damage(10, BRUTE)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
var/atk_verb = pick("punches", "kicks", "chops", "hits", "slams")
D.visible_message("<span class='danger'>[A] [atk_verb] [D]!</span>", \
"<span class='userdanger'>[A] [atk_verb] you!</span>")
D.apply_damage(rand(10,15), BRUTE)
playsound(get_turf(D), 'sound/weapons/punch1.ogg', 25, 1, -1)
if(prob(D.getBruteLoss()) && !D.lying)
D.visible_message("<span class='warning'>[D] stumbles and falls!</span>", "<span class='userdanger'>The blow sends you to the ground!</span>")
D.Weaken(4)
return 1
/datum/martial_art/the_sleeping_carp/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
add_to_streak("D")
add_to_streak("D",D)
if(check_streak(A,D))
return 1
return ..()
@@ -422,6 +468,7 @@
set category = "Sleeping Carp"
usr << "<b><i>You retreat inward and recall the teachings of the Sleeping Carp...</i></b>"
usr << "<span class='notice'>Wrist Wrench</span>: Disarm Disarm. Forces opponent to drop item in hand."
usr << "<span class='notice'>Back Kick</span>: Harm Grab. Opponent must be facing away. Knocks down."
usr << "<span class='notice'>Stomach Knee</span>: Grab Harm. Knocks the wind out of opponent and stuns."
@@ -459,6 +506,7 @@
if(slot == slot_belt)
var/mob/living/carbon/human/H = user
style.teach(H,1)
user << "<span class='sciradio'>You have an urge to flex your muscles and get into a fight. You have the knowledge of a thousand wrestlers before you. You can remember more by using the Recall teaching verb in the wrestling tab.</span>"
return
/obj/item/weapon/storage/belt/champion/wrestling/dropped(mob/user)
@@ -467,11 +515,12 @@
var/mob/living/carbon/human/H = user
if(H.get_item_by_slot(slot_belt) == src)
style.remove(H)
user << "<span class='sciradio'>You no longer have an urge to flex your muscles.</span>"
return
/obj/item/weapon/plasma_fist_scroll
name = "Plasma Fist Scroll"
desc = "Teaches the traditional wizard martial art."
name = "frayed scroll"
desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism."
icon = 'icons/obj/wizard.dmi'
icon_state ="scroll2"
var/used = 0
@@ -483,9 +532,11 @@
var/mob/living/carbon/human/H = user
var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null)
F.teach(H)
H << "<span class='notice'>You learn the PLASMA FIST style.</span>"
H << "<span class='boldannounce'>You have learned the ancient martial art of Plasma Fist.</span>"
used = 1
desc += "It looks like it's magic was used up."
desc = "It's completely blank."
name = "empty scroll"
icon_state = "blankscroll"
/obj/item/weapon/sleeping_carp_scroll
name = "mysterious scroll"
@@ -496,11 +547,8 @@
/obj/item/weapon/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user as mob)
if(!istype(user) || !user)
return
user << "<span class='notice'>You begin to read the scroll...</span>"
user << "<span class='sciradio'><i>And all at once the secrets of the Sleeping Carp fill your mind. The ancient clan's martial teachings have been imbued into this scroll. As you read through it, \
these secrets flood into your mind and body. You now know the martial techniques of the Sleeping Carp. Your hand-to-hand combat has become much more effective, and you may now perform powerful \
combination attacks. To learn more about these combos, use the Recall Teachings ability in the Sleeping Carp tab.</i></span>"
user.verbs += /mob/living/carbon/human/proc/sleeping_carp_help
user << "<span class='sciradio'>You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \
directed toward you. However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab.</span>"
var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null)
theSleepingCarp.teach(user)
user.drop_item()
@@ -508,16 +556,16 @@
new /obj/effect/decal/cleanable/ash(get_turf(src))
qdel(src)
/obj/item/weapon/twohanded/bostaff
name = "bo staff"
desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
force = 8
force = 10
w_class = 4
slot_flags = SLOT_BACK
force_unwielded = 8
force_wielded = 18
force_unwielded = 10
force_wielded = 24
throwforce = 20
throw_speed = 2
attack_verb = list("smashed", "slammed", "whacked", "thwacked")
icon = 'icons/obj/weapons.dmi'
icon_state = "bostaff0"
@@ -572,7 +620,7 @@
if(total_health <= config.health_threshold_crit && !H.stat)
H.visible_message("<span class='warning'>[user] delivers a heavy hit to [H]'s head, knocking them out cold!</span>", \
"<span class='userdanger'>[user] knocks you unconscious!</span>")
H.sleeping += 30
H.SetSleeping(30)
H.adjustBrainLoss(25)
return
else
+7 -13
View File
@@ -1,17 +1,11 @@
/obj/effect/proc_holder/spell/targeted/fake_gib
/obj/effect/proc_holder/spell/targeted/touch/fake_disintegrate
name = "Disintegrate"
desc = "This spell instantly kills somebody adjacent to you with the vilest of magick."
desc = "This spell charges your hand with vile energy that can be used to violently explode victims."
hand_path = "/obj/item/weapon/melee/touch_attack/fake_disintegrate"
school = "conjuration"
charge_max = 20
school = "evocation"
charge_max = 600
clothes_req = 0
invocation = "EI NATH"
invocation_type = "shout"
range = -1
include_user = 1
cooldown_min = 5 //25 deciseconds reduction per rank
cooldown_min = 200 //100 deciseconds reduction per rank
sparks_spread = 3
sparks_amt = 1
action_icon_state = "spell_disintegrate"
action_icon_state = "gib"
+1 -1
View File
@@ -14,7 +14,7 @@
selection_type = "range"
var/list/compatible_mobs = list(/mob/living/carbon/human)
action_icon_state = "spell_horse"
action_icon_state = "barn"
/obj/effect/proc_holder/spell/targeted/horsemask/cast(list/targets, mob/user = usr)
if(!targets.len)
+1 -3
View File
@@ -85,8 +85,6 @@
emp_heavy = 6
emp_light = 10
action_icon_state = "tech"
/obj/effect/proc_holder/spell/targeted/turf_teleport/blink
name = "Blink"
desc = "This spell randomly teleports you a short distance."
@@ -144,7 +142,7 @@
summon_type = list("/obj/effect/forcefield")
summon_lifespan = 300
action_icon_state = "spell_forcewall"
action_icon_state = "shield"
/obj/effect/proc_holder/spell/aoe_turf/conjure/timestop
name = "Stop Time"
@@ -9,10 +9,13 @@
desc = "Use to send a declaration of hostilities to the target, delaying your shuttle departure for 20 minutes while they prepare for your assault. \
Such a brazen move will attract the attention of powerful benefactors within the Syndicate, who will supply your team with a massive amount of bonus telecrystals. \
Must be used within five minutes, or your benefactors will lose interest."
var/declaring_war = 0
/obj/item/device/nuclear_challenge/attack_self(mob/living/user)
if(declaring_war)
return
if(player_list.len < MIN_CHALLENGE_PLAYERS)
user << "The enemy crew is too small to be worth declaring war on."
return
@@ -24,9 +27,11 @@
user << "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand."
return
declaring_war = 1
var/are_you_sure = alert(user, "Consult your team carefully before you declare war on [station_name()]]. Are you sure you want to alert the enemy crew?", "Declare war?", "Yes", "No")
if(are_you_sure == "No")
user << "On second thought, the element of surprise isn't so bad after all."
declaring_war = 0
return
var/war_declaration = "[user.real_name] has declared his intent to utterly destroy [station_name()] with a nuclear device, and dares the crew to try and stop them."
+1 -1
View File
@@ -642,7 +642,7 @@ var/global/list/multiverse = list()
if(heresy)
spawnheresy(M)//oh god why
else
M.makeSkeleton()
M.set_species("Skeleton")
M.visible_message("<span class = 'warning'> A massive amount of flesh sloughs off [M] and a skeleton rises up!</span>")
M.revive()
equip_skeleton(M)
+5 -8
View File
@@ -8,7 +8,7 @@
var/making_mage = 0
var/mages_made = 1
var/time_checked = 0
var/players_per_mage = 8 // If the admin wants to tweak things or something
var/players_per_mage = 6 // If the admin wants to tweak things or something
but_wait_theres_more = 1
var/delay_per_mage = 4200 // Every 7 minutes by default
var/time_till_chaos = 18000 // Half-hour in
@@ -17,11 +17,6 @@
world << "<B>The current game mode is - Ragin' Mages!</B>"
world << "<B>The \red Space Wizard Federation\black is pissed, help defeat all the space wizards!</B>"
/datum/game_mode/wizard/raginmages/pre_setup()
. = ..()
if(!max_mages)
max_mages = round(num_players() / players_per_mage)
/datum/game_mode/wizard/raginmages/greet_wizard(var/datum/mind/wizard, var/you_are=1)
if (you_are)
@@ -37,6 +32,8 @@
/datum/game_mode/wizard/raginmages/check_finished()
var/wizards_alive = 0
// Accidental pun!
var/wizard_cap = (max_mages || (num_players() / players_per_mage))
for(var/datum/mind/wizard in wizards)
if(isnull(wizard.current))
continue
@@ -78,11 +75,11 @@
if (wizards_alive)
if(!time_checked) time_checked = world.time
if(world.time > time_till_chaos && world.time > time_checked + delay_per_mage && (mages_made < max_mages))
if(world.time > time_till_chaos && world.time > time_checked + delay_per_mage && (mages_made < wizard_cap))
time_checked = world.time
make_more_mages()
else
if(wizards.len >= max_mages)
if(wizards.len >= wizard_cap)
finished = 1
return 1
else
+1 -1
View File
@@ -839,7 +839,7 @@
/obj/item/weapon/spellbook/oneuse/fake_gib
spell = /obj/effect/proc_holder/spell/targeted/fake_gib
spell = /obj/effect/proc_holder/spell/targeted/touch/fake_disintegrate
spellname = "disintegrate"
icon_state ="bookfireball"
desc = "This book feels like it will rip stuff apart."
+20 -16
View File
@@ -67,6 +67,9 @@
var/new_glove_icon_state = ""
var/new_glove_item_state = ""
var/new_glove_name = ""
var/new_bandana_icon_state = ""
var/new_bandana_item_state = ""
var/new_bandana_name = ""
var/new_shoe_icon_state = ""
var/new_shoe_name = ""
var/new_sheet_icon_state = ""
@@ -76,59 +79,57 @@
var/new_desc = "The colors are a bit dodgy."
for(var/T in typesof(/obj/item/clothing/under))
var/obj/item/clothing/under/J = new T
//world << "DEBUG: [color] == [J.color]"
if(wash_color == J.item_color)
new_jumpsuit_icon_state = J.icon_state
new_jumpsuit_item_state = J.item_state
new_jumpsuit_name = J.name
qdel(J)
//world << "DEBUG: YUP! [new_icon_state] and [new_item_state]"
break
qdel(J)
for(var/T in typesof(/obj/item/clothing/gloves/color))
var/obj/item/clothing/gloves/color/G = new T
//world << "DEBUG: [color] == [J.color]"
if(wash_color == G.item_color)
new_glove_icon_state = G.icon_state
new_glove_item_state = G.item_state
new_glove_name = G.name
qdel(G)
//world << "DEBUG: YUP! [new_icon_state] and [new_item_state]"
break
qdel(G)
for(var/T in typesof(/obj/item/clothing/shoes))
var/obj/item/clothing/shoes/S = new T
//world << "DEBUG: [color] == [J.color]"
if(wash_color == S.item_color)
new_shoe_icon_state = S.icon_state
new_shoe_name = S.name
qdel(S)
//world << "DEBUG: YUP! [new_icon_state] and [new_item_state]"
break
qdel(S)
for(var/T in typesof(/obj/item/clothing/mask/bandana))
var/obj/item/clothing/mask/bandana/M = new T
if(wash_color == M.item_color)
new_bandana_icon_state = M.icon_state
new_bandana_item_state = M.item_state
new_bandana_name = M.name
qdel(M)
break
qdel(M)
for(var/T in typesof(/obj/item/weapon/bedsheet))
var/obj/item/weapon/bedsheet/B = new T
//world << "DEBUG: [color] == [J.color]"
if(wash_color == B.item_color)
new_sheet_icon_state = B.icon_state
new_sheet_name = B.name
qdel(B)
//world << "DEBUG: YUP! [new_icon_state] and [new_item_state]"
break
qdel(B)
for(var/T in typesof(/obj/item/clothing/head/soft))
var/obj/item/clothing/head/soft/H = new T
//world << "DEBUG: [color] == [J.color]"
if(wash_color == H.item_color)
new_softcap_icon_state = H.icon_state
new_softcap_name = H.name
qdel(H)
//world << "DEBUG: YUP! [new_icon_state] and [new_item_state]"
break
qdel(H)
if(new_jumpsuit_icon_state && new_jumpsuit_item_state && new_jumpsuit_name)
for(var/obj/item/clothing/under/J in contents)
//world << "DEBUG: YUP! FOUND IT!"
J.item_state = new_jumpsuit_item_state
J.icon_state = new_jumpsuit_icon_state
J.item_color = wash_color
@@ -136,7 +137,6 @@
J.desc = new_desc
if(new_glove_icon_state && new_glove_item_state && new_glove_name)
for(var/obj/item/clothing/gloves/color/G in contents)
//world << "DEBUG: YUP! FOUND IT!"
G.item_state = new_glove_item_state
G.icon_state = new_glove_icon_state
G.item_color = wash_color
@@ -145,7 +145,6 @@
G.desc = new_desc
if(new_shoe_icon_state && new_shoe_name)
for(var/obj/item/clothing/shoes/S in contents)
//world << "DEBUG: YUP! FOUND IT!"
if (S.chained == 1)
S.chained = 0
S.slowdown = SHOES_SLOWDOWN
@@ -154,16 +153,21 @@
S.item_color = wash_color
S.name = new_shoe_name
S.desc = new_desc
if(new_bandana_icon_state && new_bandana_name)
for(var/obj/item/clothing/mask/bandana/M in contents)
M.item_state = new_bandana_item_state
M.icon_state = new_bandana_icon_state
M.item_color = wash_color
M.name = new_bandana_name
M.desc = new_desc
if(new_sheet_icon_state && new_sheet_name)
for(var/obj/item/weapon/bedsheet/B in contents)
//world << "DEBUG: YUP! FOUND IT!"
B.icon_state = new_sheet_icon_state
B.item_color = wash_color
B.name = new_sheet_name
B.desc = new_desc
if(new_softcap_icon_state && new_softcap_name)
for(var/obj/item/clothing/head/soft/H in contents)
//world << "DEBUG: YUP! FOUND IT!"
H.icon_state = new_softcap_icon_state
H.item_color = wash_color
H.name = new_softcap_name
@@ -313,4 +317,4 @@
state = 1
update_icon()
update_icon()
+3 -2
View File
@@ -30,12 +30,13 @@ LIGHTERS ARE IN LIGHTERS.DM
var/lastHolder = null
var/smoketime = 300
var/chem_volume = 30
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin")
species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin", "Grey")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi',
"Unathi" = 'icons/mob/species/unathi/mask.dmi',
"Tajaran" = 'icons/mob/species/tajaran/mask.dmi',
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi'
"Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi',
"Grey" = 'icons/mob/species/grey/mask.dmi'
)
@@ -89,7 +89,6 @@
display_contents_with_number = 0 //or else this will lead to stupid behavior.
can_hold = list() // any
cant_hold = list("/obj/item/weapon/disk/nuclear")
var/head = 0
/obj/item/weapon/storage/bag/plasticbag/mob_can_equip(M as mob, slot)
@@ -101,20 +100,19 @@
/obj/item/weapon/storage/bag/plasticbag/equipped(var/mob/user, var/slot)
if(slot==slot_head)
head = 1
storage_slots = 0
processing_objects.Add(src)
return
/obj/item/weapon/storage/bag/plasticbag/process()
if(is_equipped() && head)
if(is_equipped())
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
if(H.internal)
return
H.losebreath += 1
if(H.get_item_by_slot(slot_head) == src)
if(H.internal)
return
H.losebreath += 1
else
head = 0
storage_slots = 7
processing_objects.Remove(src)
return
+9 -12
View File
@@ -15,14 +15,12 @@
switch(my_atom.dir)
if(NORTH)
firstloc = get_step(my_atom, NORTH)
firstloc = get_step(firstloc, NORTH)
secondloc = get_step(firstloc,EAST)
if(SOUTH)
firstloc = get_step(my_atom, SOUTH)
secondloc = get_step(firstloc,EAST)
if(EAST)
firstloc = get_step(my_atom, EAST)
firstloc = get_step(firstloc, EAST)
secondloc = get_step(firstloc,NORTH)
if(WEST)
firstloc = get_step(my_atom, WEST)
@@ -72,34 +70,33 @@
var/shot_cost = 0
var/shots_per = 1
var/fire_sound
var/fire_delay = 20
var/fire_delay = 15
/obj/item/device/spacepod_equipment/weaponry/taser
name = "\improper taser system"
desc = "A weak taser system for space pods, fires electrodes that shock upon impact."
name = "disabler system"
desc = "A weak taser system for space pods, fires disabler beams."
icon_state = "pod_taser"
projectile_type = "/obj/item/projectile/beam/disabler"
shot_cost = 250
shot_cost = 400
fire_sound = "sound/weapons/Taser.ogg"
/obj/item/device/spacepod_equipment/weaponry/burst_taser
name = "\improper burst taser system"
name = "burst taser system"
desc = "A weak taser system for space pods, this one fires 3 at a time."
icon_state = "pod_b_taser"
projectile_type = "/obj/item/projectile/beam/disabler"
shot_cost = 350
shot_cost = 1200
shots_per = 3
fire_sound = "sound/weapons/Taser.ogg"
fire_delay = 40
fire_delay = 30
/obj/item/device/spacepod_equipment/weaponry/laser
name = "\improper laser system"
name = "laser system"
desc = "A weak laser system for space pods, fires concentrated bursts of energy"
icon_state = "pod_w_laser"
projectile_type = "/obj/item/projectile/beam"
shot_cost = 300
shot_cost = 600
fire_sound = 'sound/weapons/Laser.ogg'
fire_delay = 30
//base item for spacepod misc equipment (tracker)
/obj/item/device/spacepod_equipment/misc
+37 -31
View File
@@ -49,6 +49,9 @@
var/allow2enter = 1
var/move_delay = 2
var/next_move = 0
/obj/spacepod/New()
. = ..()
if(!pod_overlays)
@@ -723,43 +726,45 @@
/datum/global_iterator/pod_tank_give_air
delay = 15
process(var/obj/spacepod/spacepod)
if(spacepod && spacepod.internal_tank)
var/datum/gas_mixture/tank_air = spacepod.internal_tank.return_air()
var/datum/gas_mixture/cabin_air = spacepod.cabin_air
/datum/global_iterator/pod_tank_give_air/process(var/obj/spacepod/spacepod)
if(spacepod && spacepod.internal_tank)
var/datum/gas_mixture/tank_air = spacepod.internal_tank.return_air()
var/datum/gas_mixture/cabin_air = spacepod.cabin_air
var/release_pressure = ONE_ATMOSPHERE
var/cabin_pressure = cabin_air.return_pressure()
var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2)
var/transfer_moles = 0
if(pressure_delta > 0) //cabin pressure lower than release pressure
if(tank_air.return_temperature() > 0)
transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = tank_air.remove(transfer_moles)
cabin_air.merge(removed)
else if(pressure_delta < 0) //cabin pressure higher than release pressure
var/datum/gas_mixture/t_air = spacepod.get_turf_air()
pressure_delta = cabin_pressure - release_pressure
var/release_pressure = ONE_ATMOSPHERE
var/cabin_pressure = cabin_air.return_pressure()
var/pressure_delta = min(release_pressure - cabin_pressure, (tank_air.return_pressure() - cabin_pressure)/2)
var/transfer_moles = 0
if(pressure_delta > 0) //cabin pressure lower than release pressure
if(tank_air.return_temperature() > 0)
transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = tank_air.remove(transfer_moles)
cabin_air.merge(removed)
else if(pressure_delta < 0) //cabin pressure higher than release pressure
var/datum/gas_mixture/t_air = spacepod.get_turf_air()
pressure_delta = cabin_pressure - release_pressure
if(t_air)
pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta)
if(pressure_delta > 0) //if location pressure is lower than cabin pressure
transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles)
if(t_air)
pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta)
if(pressure_delta > 0) //if location pressure is lower than cabin pressure
transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles)
if(t_air)
t_air.merge(removed)
else //just delete the cabin gas, we're in space or some shit
qdel(removed)
else
return stop()
return
t_air.merge(removed)
else //just delete the cabin gas, we're in space or some shit
qdel(removed)
else
return stop()
return
/obj/spacepod/relaymove(mob/user, direction)
if(!CheckIfOccupant2(user))
handlerelaymove(user, direction)
/obj/spacepod/proc/handlerelaymove(mob/user, direction)
if(world.time < next_move)
return 0
var/moveship = 1
if(battery && battery.charge >= 3 && health && empcounter == 0)
if(battery && battery.charge >= 1 && health && empcounter == 0)
src.dir = direction
switch(direction)
if(NORTH)
@@ -783,16 +788,17 @@
else
if(!battery)
user << "<span class='warning'>No energy cell detected.</span>"
else if(battery.charge < 3)
else if(battery.charge < 1)
user << "<span class='warning'>Not enough charge left.</span>"
else if(!health)
user << "<span class='warning'>She's dead, Jim</span>"
else if(empcounter != 0)
user << "<span class='warning'>The pod control interface isn't responding. The console indicates [empcounter] seconds before reboot.</span>"
else
user << "<span class='warning'>Unknown error has occurred, yell at pomf.</span>"
user << "<span class='warning'>Unknown error has occurred, yell at the coders.</span>"
return 0
battery.charge = max(0, battery.charge - 3)
battery.charge = max(0, battery.charge - 1)
next_move = world.time + move_delay
/obj/spacepod/proc/CheckIfOccupant2(mob/user)
if(!src.occupant2)
+1 -1
View File
@@ -115,7 +115,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
X << 'sound/effects/adminhelp.ogg'
X << msg
if("Adminhelp")
msg = "<span class='danger'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob, "holder")]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""]:</span> <span class='danger'>[msg]</span>"
msg = "<span class='adminhelp'>[selected_type]: </span><span class='boldnotice'>[key_name(src, 1, 1, selected_type)] (<A HREF='?_src_=holder;adminmoreinfo=[ref_mob]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=[ref_mob]'>PP</A>) (<A HREF='?_src_=vars;Vars=[ref_mob]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=[ref_mob]'>SM</A>) ([admin_jump_link(mob, "holder")]) (<A HREF='?_src_=holder;check_antagonist=1'>CA</A>) (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) [ai_found ? " (<A HREF='?_src_=holder;adminchecklaws=[ref_mob]'>CL</A>)" : ""]:</span> <span class='adminhelp'>[msg]</span>"
for(var/client/X in modholders + adminholders)
if(X.prefs.sound & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
+2 -2
View File
@@ -120,7 +120,7 @@
if(check_rights(R_MOD|R_MENTOR,0) && !check_rights(R_ADMIN,0))
recieve_span = "mentorhelp"
else
recieve_span = "danger"
recieve_span = "adminhelp"
send_pm_type = holder.rank + " "
recieve_pm_type = holder.rank
@@ -175,7 +175,7 @@
X << "<span class='mentorhelp'>[type]: [key_name(src, X, 0, type)]-&gt;[key_name(C, X, 0, type)]: [msg]</span>"
if("Adminhelp")
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
X << "<span class='danger'>[type]: [key_name(src, X, 0, type)]-&gt;[key_name(C, X, 0, type)]: [msg]</span>"
X << "<span class='adminhelp'>[type]: [key_name(src, X, 0, type)]-&gt;[key_name(C, X, 0, type)]: [msg]</span>"
else
if(check_rights(R_ADMIN|R_MOD, 0, X.mob))
X << "<span class='boldnotice'>[type]: [key_name(src, X, 0, type)]-&gt;[key_name(C, X, 0, type)]: [msg]</span>"
+34 -2
View File
@@ -285,16 +285,32 @@ BLIND // can't see anything
//Proc that moves gas/breath masks out of the way
/obj/item/clothing/mask/proc/adjustmask(var/mob/user)
var/mob/living/carbon/human/H = usr //Used to check if the mask is on the head, to check if the hands are full, and to turn off internals if they were on when the mask was pushed out of the way.
if(!ignore_maskadjust)
if(!user.canmove || user.stat || user.restrained())
return
if(src.mask_adjusted == 1)
src.icon_state = initial(icon_state)
src.icon_state = copytext(src.icon_state, 1, findtext(src.icon_state, "_up")) //Trims the '_up' off the end of the icon state, thus reverting to the most recent previous state
gas_transfer_coefficient = initial(gas_transfer_coefficient)
permeability_coefficient = initial(permeability_coefficient)
user << "You push \the [src] back into place."
src.mask_adjusted = 0
slot_flags = initial(slot_flags)
if(flags_inv != initial(flags_inv)) //If the mask is one that hides the face and can be adjusted yet lost that trait when it was adjusted, make it hide the face again.
flags_inv += HIDEFACE
if(H.head == src)
if(src.flags_inv == HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer.
if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground.
user.unEquip(src)
else
src.loc = user
H.head = null
if(!(H.l_hand) && H.r_hand) //If only the left hand is free, put the bandana there instead.
user.put_in_l_hand(src)
else if(!(H.r_hand) && H.l_hand) //Otherwise if only the right hand is free, put the bandana there instead.
user.put_in_r_hand(src)
else if(!(H.l_hand && H.r_hand)) //Otherwise if both hands are free, pick the active one to put the bandana into.
user.put_in_active_hand(src)
else
src.icon_state += "_up"
user << "You push \the [src] out of the way."
@@ -304,12 +320,28 @@ BLIND // can't see anything
if(adjusted_flags)
slot_flags = adjusted_flags
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.internal)
if(H.internals)
H.internals.icon_state = "internal0"
H.internal = null
if(user.wear_mask == src)
if(src.flags_inv == HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer.
if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground.
user.unEquip(src)
else
src.loc = user
user.wear_mask = null
if(!(H.l_hand) && H.r_hand) //If only the left hand is free, put the bandana there instead.
user.put_in_l_hand(src)
else if(!(H.r_hand) && H.l_hand) //Otherwise if only the right hand is free, put the bandana there instead.
user.put_in_r_hand(src)
else if(!(H.l_hand && H.r_hand)) //Otherwise if both hands are free, pick the active one to put the bandana into.
user.put_in_active_hand(src)
flags_inv -= HIDEFACE /*Done after the above to avoid having to do a check for initial(src.flags_inv == HIDEFACE).
This reveals the user's face since the bandana will now be going on their head.*/
usr.update_inv_wear_mask()
usr.update_inv_head()
//Shoes
/obj/item/clothing/shoes
+23 -2
View File
@@ -197,18 +197,38 @@
obj/item/clothing/mask/bandana/red
name = "red bandana"
icon_state = "bandred"
item_color = "red"
desc = "It's a red bandana."
obj/item/clothing/mask/bandana/blue
name = "blue bandana"
icon_state = "bandblue"
item_color = "blue"
desc = "It's a blue bandana."
obj/item/clothing/mask/bandana/gold
name = "gold bandana"
icon_state = "bandgold"
item_color = "yellow"
desc = "It's a gold bandana."
obj/item/clothing/mask/bandana/green
name = "green bandana"
icon_state = "bandgreen"
item_color = "green"
desc = "It's a green bandana."
obj/item/clothing/mask/bandana/orange
name = "orange bandana"
icon_state = "bandorange"
item_color = "orange"
desc = "It's an orange bandana."
obj/item/clothing/mask/bandana/purple
name = "purple bandana"
icon_state = "bandpurple"
item_color = "purple"
desc = "It's a purple bandana."
/obj/item/clothing/mask/bandana/botany
name = "botany bandana"
@@ -222,5 +242,6 @@ obj/item/clothing/mask/bandana/green
/obj/item/clothing/mask/bandana/black
name = "black bandana"
desc = "It's a black bandana."
icon_state = "bandblack"
icon_state = "bandblack"
item_color = "black"
desc = "It's a black bandana."
+4 -3
View File
@@ -1,7 +1,8 @@
/proc/send2irc(var/channel, var/msg)
if(config.use_irc_bot && config.irc_bot_host)
spawn(0)
ext_python("ircbot_message.py", "[config.comms_password] [config.irc_bot_host] [channel] [msg]")
if(config.use_irc_bot && config.irc_bot_host.len)
for(var/IP in config.irc_bot_host)
spawn(0)
ext_python("ircbot_message.py", "[config.comms_password] [IP] [channel] [msg]")
return
/proc/send2mainirc(var/msg)
+4
View File
@@ -68,3 +68,7 @@
/datum/deepfryer_special/fried_tofu
input = /obj/item/weapon/reagent_containers/food/snacks/tofu
output = /obj/item/weapon/reagent_containers/food/snacks/fried_tofu
/datum/deepfryer_special/chimichanga
input = /obj/item/weapon/reagent_containers/food/snacks/burrito
output = /obj/item/weapon/reagent_containers/food/snacks/chimichanga
+10
View File
@@ -280,6 +280,16 @@
)
result = /obj/item/weapon/reagent_containers/food/snacks/enchiladas
/datum/recipe/microwave/burrito
reagents = list("capsaicin" = 5, "rice" = 5)
items = list(
/obj/item/weapon/reagent_containers/food/snacks/cutlet,
/obj/item/weapon/reagent_containers/food/snacks/beans,
/obj/item/weapon/reagent_containers/food/snacks/cheesewedge,
/obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough,
)
result = /obj/item/weapon/reagent_containers/food/snacks/burrito
/datum/recipe/microwave/monkeysdelight
fruit = list("banana" = 1)
reagents = list("sodiumchloride" = 1, "blackpepper" = 1, "flour" = 10)
+6
View File
@@ -785,6 +785,12 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
/mob/living/carbon/proc/slip(var/description, var/stun, var/weaken, var/tilesSlipped, var/walkSafely, var/slipAny)
if (flying || buckled || (walkSafely && m_intent == "walk"))
return
if ((lying) && (!(tilesSlipped)))
return
if (istype(loc, /obj/structure/closet)) // for getting in a locker
return
for (var/obj/structure/closet/closet in loc.contents) // for getting out of a locker
return
if (!(slipAny))
if (istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src
@@ -394,6 +394,15 @@
var/obj/item/organ/external/affecting = get_organ(ran_zone(dam_zone))
apply_damage(5, BRUTE, affecting, run_armor_check(affecting, "melee"))
/mob/living/carbon/human/bullet_act()
if(martial_art && martial_art.deflection_chance) //Some martial arts users can deflect projectiles!
if(!prob(martial_art.deflection_chance))
return ..()
if(!src.lying && !(HULK in mutations)) //But only if they're not lying down, and hulks can't do it
src.visible_message("<span class='warning'>[src] deflects the projectile!</span>", "<span class='userdanger'>You deflect the projectile!</span>")
return 0
..()
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M as mob)
if(M.melee_damage_upper == 0)
M.custom_emote(1, "[M.friendly] [src]")
@@ -148,7 +148,7 @@
else
LAssailant = M
var/damage = rand(0, M.species.max_hurt_damage)//BS12 EDIT
var/damage = rand(M.species.punchdamagelow, M.species.punchdamagehigh)
damage += attack.damage
if(!damage)
playsound(loc, attack.miss_sound, 25, 1, -1)
@@ -167,7 +167,7 @@
visible_message("\red <B>[M] [pick(attack.attack_verb)]ed [src]!</B>")
apply_damage(damage, BRUTE, affecting, armor_block, sharp=attack.sharp, edge=attack.edge) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway.
if((stat != DEAD) && damage >= 9)
if((stat != DEAD) && damage >= M.species.punchstunthreshold)
visible_message("<span class='danger'>[M] has weakened [src]!</span>", \
"<span class='userdanger'>[M] has weakened [src]!</span>")
apply_effect(4, WEAKEN, armor_block)
@@ -6,6 +6,8 @@
language = "Wryn Hivemind"
tail = "wryntail"
unarmed_type = /datum/unarmed_attack/punch/weak
punchdamagelow = 0
punchdamagehigh = 1
//primitive = /mob/living/carbon/monkey/wryn
darksight = 3
slowdown = 1
@@ -6,12 +6,33 @@
deform = 'icons/mob/human_races/r_golem.dmi'
default_language = "Galactic Common"
flags = NO_BREATHE | NO_PAIN | NO_BLOOD | NO_SCAN
flags = NO_BREATHE | NO_BLOOD | RADIMMUNE
virus_immune = 1
dietflags = DIET_OMNI //golems can eat anything because they are magic or something
reagent_tag = PROCESS_ORG
unarmed_type = /datum/unarmed_attack/punch
punchdamagelow = 5
punchdamagehigh = 14
punchstunthreshold = 11 //about 40% chance to stun
warning_low_pressure = -1
hazard_low_pressure = -1
hazard_high_pressure = 999999999
warning_high_pressure = 999999999
cold_level_1 = -1
cold_level_2 = -1
cold_level_3 = -1
heat_level_1 = 999999999
heat_level_2 = 999999999
heat_level_3 = 999999999
heat_level_3_breathe = 999999999
blood_color = "#515573"
flesh_color = "#137E8F"
slowdown = 3
siemens_coeff = 0
has_organ = list(
@@ -45,62 +66,36 @@
item_color = "golem"
has_sensor = 0
flags = ABSTRACT | NODROP
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/suit/golem
name = "adamantine shell"
desc = "a golem's thick outter shell"
icon_state = "golem"
item_state = "golem"
w_class = 4//bulky item
gas_transfer_coefficient = 0.90
permeability_coefficient = 0.50
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS|HEAD
slowdown = 1.0
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
flags = ONESIZEFITSALL | STOPSPRESSUREDMAGE | ABSTRACT | NODROP
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS | HEAD
max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS | HEAD
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
armor = list(melee = 80, bullet = 20, laser = 20, energy = 10, bomb = 0, bio = 0, rad = 0)
body_parts_covered = HEAD|UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES
flags = ONESIZEFITSALL | ABSTRACT | NODROP | THICKMATERIAL
armor = list(melee = 55, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
/obj/item/clothing/shoes/golem
name = "golem's feet"
desc = "sturdy adamantine feet"
icon_state = "golem"
item_state = "golem"
flags = NOSLIP | ABSTRACT | AIRTIGHT | MASKCOVERSMOUTH | NODROP
slowdown = SHOES_SLOWDOWN+1
flags = ABSTRACT | NODROP
/obj/item/clothing/mask/gas/golem
name = "golem's face"
desc = "the imposing face of an adamantine golem"
icon_state = "golem"
item_state = "golem"
siemens_coefficient = 0
unacidable = 1
flags = ABSTRACT | NODROP
/obj/item/clothing/gloves/golem
name = "golem's hands"
desc = "strong adamantine hands"
icon_state = "golem"
item_state = null
siemens_coefficient = 0
flags = ABSTRACT | NODROP
/obj/item/clothing/head/space/golem
icon_state = "golem"
item_state = "dermal"
item_color = "dermal"
name = "golem's head"
desc = "a golem's head"
unacidable = 1
flags = STOPSPRESSUREDMAGE | ABSTRACT | NODROP
heat_protection = HEAD
max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT
armor = list(melee = 80, bullet = 20, laser = 20, energy = 10, bomb = 0, bio = 0, rad = 0)
flags = ABSTRACT | NODROP
@@ -57,7 +57,9 @@
var/light_effect_amp //If 0, takes/heals 1 burn and brute per tick. Otherwise, both healing and damage effects are amplified.
var/total_health = 100
var/max_hurt_damage = 9 // Max melee damage dealt + 5 if hulk
var/punchdamagelow = 0 //lowest possible punch damage
var/punchdamagehigh = 9 //highest possible punch damage
var/punchstunthreshold = 9 //damage at which punches from this race will stun //yes it should be to the attacked race but it's not useful that way even if it's logical
var/list/default_genes = list()
var/ventcrawler = 0 //Determines if the mob can go through the vents.
@@ -350,7 +352,7 @@
/datum/unarmed_attack
var/attack_verb = list("attack") // Empty hand hurt intent verb.
var/damage = 0 // Extra empty hand attack damage.
var/damage = 0 // How much flat bonus damage an attack will do. This is a *bonus* guaranteed damage amount on top of the random damage attacks do.
var/attack_sound = "punch"
var/miss_sound = 'sound/weapons/punchmiss.ogg'
var/sharp = 0
@@ -361,7 +363,6 @@
/datum/unarmed_attack/punch/weak
attack_verb = list("flail")
damage = 1
/datum/unarmed_attack/diona
attack_verb = list("lash", "bludgeon")
@@ -375,7 +376,7 @@
/datum/unarmed_attack/claws/armalis
attack_verb = list("slash", "claw")
damage = 6 //they're huge! they should do a little more damage, i'd even go for 15-20 maybe...
damage = 6
/datum/species/proc/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user)
return 0
@@ -956,6 +956,7 @@ var/global/list/damage_icon_parts = list()
client.screen |= contents
if(hud_used)
hud_used.hidden_inventory_update() //Updates the screenloc of the items on the 'other' inventory bar
update_inv_handcuffed(0) // update handcuff overlay
/mob/living/carbon/human/update_inv_handcuffed(var/update_icons=1)
@@ -964,22 +965,23 @@ var/global/list/damage_icon_parts = list()
drop_l_hand()
stop_pulling() //TODO: should be handled elsewhere
if(hud_used) //hud handcuff icons
var/obj/screen/inventory/R = hud_used.adding[7]
var/obj/screen/inventory/L = hud_used.adding[8]
var/obj/screen/inventory/R = hud_used.r_hand_hud_object
var/obj/screen/inventory/L = hud_used.l_hand_hud_object
R.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="markus")
L.overlays += image("icon"='icons/mob/screen_gen.dmi', "icon_state"="gabrielle")
if(istype(handcuffed, /obj/item/weapon/restraints/handcuffs/pinkcuffs))
overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "pinkcuff1")
overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "pinkcuff1")
else
overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "handcuff1")
overlays_standing[HANDCUFF_LAYER] = image("icon" = 'icons/mob/mob.dmi', "icon_state" = "handcuff1")
else
overlays_standing[HANDCUFF_LAYER] = null
overlays_standing[HANDCUFF_LAYER] = null
if(hud_used)
var/obj/screen/inventory/R = hud_used.adding[7]
var/obj/screen/inventory/L = hud_used.adding[8]
R.overlays = null
L.overlays = null
if(update_icons) update_icons()
var/obj/screen/inventory/R = hud_used.r_hand_hud_object
var/obj/screen/inventory/L = hud_used.l_hand_hud_object
R.overlays.Cut()
L.overlays.Cut()
if(update_icons)
update_icons()
/mob/living/carbon/human/update_inv_legcuffed(var/update_icons=1)
if(legcuffed)
@@ -1759,6 +1759,29 @@
reagents.add_reagent("capsaicin", 6)
bitesize = 4
/obj/item/weapon/reagent_containers/food/snacks/burrito
name = "Burrito"
desc = "Meat, beans, cheese, and rice wrapped up as an easy-to-hold meal."
icon_state = "burrito"
trash = /obj/item/trash/plate
filling_color = "#A36A1F"
/obj/item/weapon/reagent_containers/food/snacks/burrito/New()
..()
reagents.add_reagent("nutriment", 5)
/obj/item/weapon/reagent_containers/food/snacks/chimichanga
name = "Chimichanga"
desc = "Time to eat a chimi-f***ing-changa."
icon_state = "chimichanga"
trash = /obj/item/trash/plate
filling_color = "#A36A1F"
/obj/item/weapon/reagent_containers/food/snacks/chimichanga/New()
..()
reagents.add_reagent("omnizine", 4) //Deadpool reference. Deal with it.
reagents.add_reagent("cheese", 2)
/obj/item/weapon/reagent_containers/food/snacks/monkeysdelight
name = "monkey's Delight"
desc = "Eeee Eee!"
+2 -2
View File
@@ -245,8 +245,8 @@ GHOST_INTERACTION
## Uncomment to enable sending data to the IRC bot.
#USE_IRC_BOT
## Host where the IRC bot is hosted. Port 45678 needs to be open.
#IRC_BOT_HOST localhost
## Host(s) where the IRC bot is hosted. Seperate IP's by ;. Port 45678 needs to be open.
#IRC_BOT_HOST 127.0.0.1;localhost
## IRC channel to send information to. Leave blank to disable.
#MAIN_IRC #main
+10
View File
@@ -0,0 +1,10 @@
author: KasparoVy
delete-after: True
changes:
- rscadd: "Orange and purple bandanas for all station species."
- rscadd: "The ability to colour bandanas with a crayon in a washing machine."
- tweak: "Refactors the bandana adjustment system."
- tweak: "Minor adjustments to Tajaran and Unathi bandana east/west sprites."
- tweak: "Adjusting a bandana will now take if off of your head/face and put it in an available hand. If both hands are available, it goes in the selected hand."
- bugfix: "Adjusting a coloured bandana will no longer revert it to the original coloured icons anymore."
- bugfix: "Adjusting a bandana from mask-style to hat-style means the bandana won't obscure your identity anymore."
@@ -0,0 +1,4 @@
author: Fox McCloud
delete-after: True
changes:
- tweak: "Updates some spell icons with better/higher quality icons"
@@ -0,0 +1,5 @@
author: Crazylemon64
delete-after: True
changes:
- tweak: "Mages are now more ragin"
- tweak: "Admins can now adjust the total number of wizards at runtime by tweaking either max_mages, or players_per mage"
@@ -0,0 +1,4 @@
author: DaveTheHeadcrab
delete-after: True
changes:
- rscadd: "Adds new worn icons for duffelbags to better reflect their size, compliments of WJohn at /tg/"
@@ -0,0 +1,4 @@
author: KasparoVy
delete-after: True
changes:
- rscadd: "Greys now use re-positioned smokeables. They no longer smoke out the eyes."
+12
View File
@@ -0,0 +1,12 @@
author: Fox McCloud
delete-after: True
changes:
- tweak: "Updates unarmed attacks to allow for more customization"
- tweak: "Updates martial arts so they factor in specie's attack messages and sounds"
- tweak: "Re-balances Sleeping Carp fighting style"
- tweak: "Re-balances Bo Staff"
- tweak: "Rebalances Golem: they should now be spaceproof, fire+cold proof, rad proof, virus immune, clonable, parapen+syringe gun immune, deal increased melee damage. Their armor has been reduced to 55 melee across the board, their slip immunity removed, pain immunity removed, and they're slightly slower"
- bugfix: "Fixes Ei Nath generating two brains"
- bugfix: "Ensures the Necromatic Stone generates actual skeletons"
- bugfix: "Can now strip PDA/IDs from Golems"
- bugfix: "Fixes sleeping carp grab not being an instant aggressive grab"
@@ -0,0 +1,8 @@
author: TheDZD
delete-after: True
changes:
- bugfix: "Fixes spacepods being able to shoot through walls."
- tweak: "Lowers spacepod weapons fire delay."
- tweak: "Increases spacepod weapons energy costs."
- tweak: "Makes spacepods move at speeds not rivaling those of photon beams. They are now a hair bit faster than a person with a jetpack."
- tweak: "Reduces battery costs for spacepod movement."
@@ -0,0 +1,5 @@
author: FalseIncarnate
delete-after: True
changes:
- rscadd: "Adds burritos, made from cutlets, beans, rice, capsacin oil (hotsauce), cheese, and flat dough (because we lack proper tortillas) in the microwave."
- rscadd: "Adds chimichangas. You know you want a deep-fried burrito."
@@ -0,0 +1,4 @@
author: Fox McCloud
delete-after: True
changes:
- bugfix: "Fixes an exploit with declaring war on the station"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 120 KiB

+1
View File
@@ -20,6 +20,7 @@ em {font-style: normal; font-weight: bold;}
.adminobserverooc {color: #0099cc; font-weight: bold;}
.adminooc {color: #b82e00; font-weight: bold;}
.mentorhelp {color: #0077bb; font-weight: bold;}
.adminhelp {color: #aa0000; font-weight: bolt;}
.adminobserver {color: #996600; font-weight: bold;}
.admin {color: #386aff; font-weight: bold;}
+1
View File
@@ -167,6 +167,7 @@
#include "code\controllers\Processes\shuttles.dm"
#include "code\controllers\Processes\sun.dm"
#include "code\controllers\Processes\ticker.dm"
#include "code\controllers\Processes\timer.dm"
#include "code\controllers\Processes\vote.dm"
#include "code\controllers\Processes\shuttles\emergency.dm"
#include "code\controllers\Processes\shuttles\supply.dm"