Merge branch 'master' into assu
This commit is contained in:
@@ -82,13 +82,6 @@
|
||||
item_state = "nr_helmet"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
|
||||
/obj/item/clothing/head/stalhelm
|
||||
name = "Stalhelm"
|
||||
desc = "Ein Helm, um die Nazi-Interesse an fremden Raumstationen zu sichern."
|
||||
icon_state = "stalhelm"
|
||||
item_state = "stalhelm"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
|
||||
/obj/item/clothing/head/panzer
|
||||
name = "Panzer Cap"
|
||||
desc = "Command any mech in style."
|
||||
@@ -96,13 +89,6 @@
|
||||
item_state = "panzercap"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
|
||||
/obj/item/clothing/head/naziofficer
|
||||
name = "Officer Cap"
|
||||
desc = "Style is all that matters."
|
||||
icon_state = "officercap"
|
||||
item_state = "officercap"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
|
||||
/obj/item/clothing/head/russobluecamohat
|
||||
name = "russian blue camo beret"
|
||||
desc = "A symbol of discipline, honor, and lots and lots of removal of some type of skewered food."
|
||||
|
||||
@@ -1,24 +1,5 @@
|
||||
|
||||
//VG Ports
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/nazi
|
||||
name = "nazi hardhelmet"
|
||||
desc = "This is the face of das vaterland's top elite. Gas or energy are your only escapes."
|
||||
item_state = "hardsuit0-nazi"
|
||||
icon_state = "hardsuit0-nazi"
|
||||
armor = list(melee = 40, bullet = 30, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 20)
|
||||
item_color = "nazi"
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/nazi
|
||||
name = "nazi hardsuit"
|
||||
desc = "The attire of a true krieger. All shall fall, and only das vaterland will remain."
|
||||
item_state = "hardsuit-nazi"
|
||||
icon_state = "hardsuit-nazi"
|
||||
slowdown = 1
|
||||
armor = list(melee = 40, bullet = 30, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 20)
|
||||
allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/melee/)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/nazi
|
||||
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/soviet
|
||||
name = "soviet hardhelmet"
|
||||
|
||||
@@ -8,8 +8,11 @@
|
||||
/datum/round_event/wizard/rpgloot/start()
|
||||
var/upgrade_scroll_chance = 0
|
||||
for(var/obj/item/I in world)
|
||||
if(!istype(I.rpg_loot))
|
||||
I.rpg_loot = new(I)
|
||||
CHECK_TICK
|
||||
if(!(I.flags_1 & INITIALIZED_1))
|
||||
continue
|
||||
|
||||
I.AddComponent(/datum/component/fantasy)
|
||||
|
||||
if(istype(I, /obj/item/storage))
|
||||
var/obj/item/storage/S = I
|
||||
@@ -31,86 +34,20 @@
|
||||
|
||||
var/upgrade_amount = 1
|
||||
var/can_backfire = TRUE
|
||||
var/one_use = TRUE
|
||||
var/uses = 1
|
||||
|
||||
/obj/item/upgradescroll/afterattack(obj/item/target, mob/user , proximity)
|
||||
. = ..()
|
||||
if(!proximity || !istype(target))
|
||||
return
|
||||
|
||||
var/datum/rpg_loot/rpg_loot_datum = target.rpg_loot
|
||||
if(!istype(rpg_loot_datum))
|
||||
target.rpg_loot = rpg_loot_datum = new /datum/rpg_loot(target)
|
||||
target.AddComponent(/datum/component/fantasy, upgrade_amount, null, null, can_backfire, TRUE)
|
||||
|
||||
var/quality = rpg_loot_datum.quality
|
||||
|
||||
if(can_backfire && (quality > 9 && prob((quality - 9)*10)))
|
||||
to_chat(user, "<span class='danger'>[target] violently glows blue for a while, then evaporates.</span>")
|
||||
target.burn()
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[target] glows blue and seems vaguely \"better\"!</span>")
|
||||
rpg_loot_datum.modify(upgrade_amount)
|
||||
|
||||
if(one_use)
|
||||
if(--uses <= 0)
|
||||
qdel(src)
|
||||
|
||||
/obj/item/upgradescroll/unlimited
|
||||
name = "unlimited foolproof item fortification scroll"
|
||||
desc = "Somehow, this piece of paper can be applied to items to make them \"better\". This scroll is made from the tongues of dead paper wizards, and can be used an unlimited number of times, with no drawbacks."
|
||||
one_use = FALSE
|
||||
uses = INFINITY
|
||||
can_backfire = FALSE
|
||||
|
||||
/datum/rpg_loot
|
||||
var/positive_prefix = "okay"
|
||||
var/negative_prefix = "weak"
|
||||
var/suffix = "something profound"
|
||||
var/quality = 0
|
||||
|
||||
var/obj/item/attached
|
||||
var/original_name
|
||||
|
||||
/datum/rpg_loot/New(attached_item=null)
|
||||
attached = attached_item
|
||||
|
||||
randomise()
|
||||
|
||||
/datum/rpg_loot/Destroy()
|
||||
attached = null
|
||||
|
||||
/datum/rpg_loot/proc/randomise()
|
||||
var/static/list/prefixespositive = list("greater", "major", "blessed", "superior", "empowered", "honed", "true", "glorious", "robust")
|
||||
var/static/list/prefixesnegative = list("lesser", "minor", "blighted", "inferior", "enfeebled", "rusted", "unsteady", "tragic", "gimped")
|
||||
var/static/list/suffixes = list("orc slaying", "elf slaying", "corgi slaying", "strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma", "the forest", "the hills", "the plains", "the sea", "the sun", "the moon", "the void", "the world", "the fool", "many secrets", "many tales", "many colors", "rending", "sundering", "the night", "the day")
|
||||
|
||||
var/new_quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0)
|
||||
|
||||
suffix = pick(suffixes)
|
||||
positive_prefix = pick(prefixespositive)
|
||||
negative_prefix = pick(prefixesnegative)
|
||||
|
||||
if(prob(50))
|
||||
new_quality = -new_quality
|
||||
|
||||
modify(new_quality)
|
||||
|
||||
/datum/rpg_loot/proc/rename()
|
||||
var/obj/item/I = attached
|
||||
if(!original_name)
|
||||
original_name = I.name
|
||||
if(quality < 0)
|
||||
I.name = "[negative_prefix] [original_name] of [suffix] [quality]"
|
||||
else if(quality == 0)
|
||||
I.name = "[original_name] of [suffix]"
|
||||
else if(quality > 0)
|
||||
I.name = "[positive_prefix] [original_name] of [suffix] +[quality]"
|
||||
|
||||
/datum/rpg_loot/proc/modify(quality_mod)
|
||||
var/obj/item/I = attached
|
||||
quality += quality_mod
|
||||
|
||||
I.force = max(0,I.force + quality_mod)
|
||||
I.throwforce = max(0,I.throwforce + quality_mod)
|
||||
|
||||
I.armor = I.armor.modifyAllRatings(quality)
|
||||
|
||||
rename()
|
||||
|
||||
@@ -95,45 +95,34 @@
|
||||
last_poof = world.realtime
|
||||
var/datum/reagents/R = new/datum/reagents(100)//Hey, just in case.
|
||||
var/datum/effect_system/smoke_spread/chem/s = new()
|
||||
R.add_reagent("secretcatchem", (10))
|
||||
R.add_reagent("secretcatchem", 10)
|
||||
s.set_up(R, 0, loc)
|
||||
s.start()
|
||||
visible_message("<b>[src]</b> disappears in a puff of smoke!")
|
||||
canmove = TRUE
|
||||
health = 25
|
||||
|
||||
var/hp_list = list()
|
||||
for(var/obj/machinery/holopad/hp in world)
|
||||
hp_list += hp
|
||||
//Try to go to populated areas
|
||||
var/list/pop_areas = list()
|
||||
for(var/mob/living/L in GLOB.player_list)
|
||||
var/area/A = get_area(L)
|
||||
pop_areas += A
|
||||
|
||||
var/nono_areas = list("AI ")
|
||||
|
||||
for(var/i = 0, i <= 6, i+=1) //Attempts a jump 6 times.
|
||||
var/obj/machinery/holopad/hp = pick(hp_list)
|
||||
if(forceMove(pick(hp.loc)))
|
||||
|
||||
var/jacq_please_no = FALSE
|
||||
for(var/no_area in nono_areas)
|
||||
var/turf/L1 = hp.loc
|
||||
if(!L1) //Incase the area isn't a turf (i.e. in a locker)
|
||||
continue
|
||||
var/area/L2 = L1.loc
|
||||
if(L2)
|
||||
if(findtext(L2.name, no_area))
|
||||
jacq_please_no = TRUE
|
||||
|
||||
if(jacq_please_no)
|
||||
i-=1
|
||||
continue
|
||||
|
||||
//Try to go to populated areas
|
||||
var/list/seen = viewers(8, get_turf(src))
|
||||
for(var/victim in seen)
|
||||
if(ishuman(victim))
|
||||
if(z == cached_z)
|
||||
return TRUE
|
||||
var/list/targets = list()
|
||||
for(var/H in GLOB.network_holopads)
|
||||
var/area/A = get_area(H)
|
||||
if(findtextEx(A, "AI") || !(A in pop_areas) || !is_station_level(H))
|
||||
continue
|
||||
targets += H
|
||||
|
||||
if(!targets)
|
||||
targets = GLOB.generic_event_spawns
|
||||
|
||||
for(var/i in 1 to 6) //Attempts a jump up to 6 times.
|
||||
var/atom/A = pick(targets)
|
||||
if(do_teleport(src, A, channel = TELEPORT_CHANNEL_MAGIC))
|
||||
return TRUE
|
||||
targets -= A
|
||||
return FALSE
|
||||
|
||||
/mob/living/simple_animal/jacq/proc/gender_check(mob/living/carbon/C)
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
playsound(C, pick(spooks), 50, TRUE, 10)
|
||||
|
||||
//Congrats you somehow died so hard you stopped being a zombie
|
||||
/datum/species/zombie/infectious/spec_death(mob/living/carbon/C)
|
||||
/datum/species/zombie/infectious/spec_death(gibbed, mob/living/carbon/C)
|
||||
. = ..()
|
||||
var/obj/item/organ/zombie_infection/infection
|
||||
infection = C.getorganslot(ORGAN_SLOT_ZOMBIE)
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
var/datum/gas_mixture/breath
|
||||
|
||||
if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE))
|
||||
if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || lungs.organ_flags & ORGAN_FAILING)
|
||||
if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || !lungs || lungs.organ_flags & ORGAN_FAILING)
|
||||
losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath
|
||||
|
||||
else if(health <= crit_threshold)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define GORILLA_TOTAL_LAYERS 1
|
||||
|
||||
/mob/living/simple_animal/hostile/gorilla
|
||||
name = "Gorilla"
|
||||
name = "gorilla"
|
||||
desc = "A ground-dwelling, predominantly herbivorous ape that inhabits the forests of central Africa."
|
||||
icon = 'icons/mob/gorilla.dmi'
|
||||
icon_state = "crawling"
|
||||
@@ -108,3 +108,10 @@
|
||||
playsound(src, 'sound/creatures/gorilla.ogg', 200)
|
||||
oogas = 0
|
||||
|
||||
/mob/living/simple_animal/hostile/gorilla/familiar
|
||||
name = "familiar gorilla"
|
||||
desc = "There is no need to be upset."
|
||||
unique_name = FALSE
|
||||
AIStatus = AI_OFF
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
@@ -344,6 +344,7 @@
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/proc/AttackingTarget()
|
||||
SEND_SIGNAL(src, COMSIG_HOSTILE_ATTACKINGTARGET, target)
|
||||
in_melee = TRUE
|
||||
if(vore_active)
|
||||
if(isliving(target))
|
||||
@@ -426,12 +427,13 @@
|
||||
if(casingtype)
|
||||
var/obj/item/ammo_casing/casing = new casingtype(startloc)
|
||||
playsound(src, projectilesound, 100, 1)
|
||||
casing.fire_casing(targeted_atom, src, null, null, null, ran_zone())
|
||||
casing.fire_casing(targeted_atom, src, null, null, null, ran_zone(), src)
|
||||
else if(projectiletype)
|
||||
var/obj/item/projectile/P = new projectiletype(startloc)
|
||||
playsound(src, projectilesound, 100, 1)
|
||||
P.starting = startloc
|
||||
P.firer = src
|
||||
P.fired_from = src
|
||||
P.yo = targeted_atom.y - startloc.y
|
||||
P.xo = targeted_atom.x - startloc.x
|
||||
if(AIStatus != AI_ON)//Don't want mindless mobs to have their movement screwed up firing in space
|
||||
|
||||
@@ -199,6 +199,7 @@
|
||||
if(prob(35))
|
||||
sparks.start()
|
||||
P.firer = user ? user : src
|
||||
P.fired_from = src
|
||||
if(last_projectile_params)
|
||||
P.p_x = last_projectile_params[2]
|
||||
P.p_y = last_projectile_params[3]
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/obj/item/ammo_casing/proc/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread)
|
||||
/obj/item/ammo_casing/proc/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from)
|
||||
distro += variance
|
||||
for (var/i = max(1, pellets), i > 0, i--)
|
||||
var/targloc = get_turf(target)
|
||||
ready_proj(target, user, quiet, zone_override)
|
||||
ready_proj(target, user, quiet, zone_override, fired_from)
|
||||
if(distro) //We have to spread a pixel-precision bullet. throw_proj was called before so angles should exist by now...
|
||||
if(randomspread)
|
||||
spread = round((rand() - 0.5) * distro)
|
||||
@@ -20,11 +20,12 @@
|
||||
update_icon()
|
||||
return 1
|
||||
|
||||
/obj/item/ammo_casing/proc/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
|
||||
/obj/item/ammo_casing/proc/ready_proj(atom/target, mob/living/user, quiet, zone_override = "", fired_from)
|
||||
if (!BB)
|
||||
return
|
||||
BB.original = target
|
||||
BB.firer = user
|
||||
BB.fired_from = fired_from
|
||||
if (zone_override)
|
||||
BB.def_zone = zone_override
|
||||
else
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
firing_effect_type = null
|
||||
heavy_metal = FALSE
|
||||
|
||||
/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread)
|
||||
/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from)
|
||||
if (..()) //successfully firing
|
||||
moveToNullspace()
|
||||
QDEL_NULL(src)
|
||||
|
||||
@@ -233,7 +233,7 @@
|
||||
else //Smart spread
|
||||
sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread), 1)
|
||||
|
||||
if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd))
|
||||
if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, src))
|
||||
shoot_with_empty_chamber(user)
|
||||
firing_burst = FALSE
|
||||
return FALSE
|
||||
@@ -280,7 +280,7 @@
|
||||
to_chat(user, "<span class='notice'> [src] is lethally chambered! You don't want to risk harming anyone...</span>")
|
||||
return
|
||||
sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
|
||||
if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd))
|
||||
if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src))
|
||||
shoot_with_empty_chamber(user)
|
||||
return
|
||||
else
|
||||
|
||||
@@ -331,9 +331,9 @@
|
||||
uninstall(KA)
|
||||
|
||||
/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/gun/energy/kinetic_accelerator/KA, forcemove = TRUE)
|
||||
KA.modkits -= src
|
||||
if(forcemove)
|
||||
forceMove(get_turf(KA))
|
||||
KA.modkits -= src
|
||||
|
||||
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
var/def_zone = "" //Aiming at
|
||||
var/atom/movable/firer = null//Who shot it
|
||||
var/atom/fired_from = null // the atom that the projectile was fired from (gun, turret)
|
||||
var/suppressed = FALSE //Attack message
|
||||
var/candink = FALSE //Can this projectile play the dink sound when hitting the head?
|
||||
var/yo = null
|
||||
@@ -131,6 +132,8 @@
|
||||
return TRUE
|
||||
|
||||
/obj/item/projectile/proc/on_hit(atom/target, blocked = FALSE)
|
||||
if(fired_from)
|
||||
SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_ON_HIT, firer, target, Angle)
|
||||
var/turf/target_loca = get_turf(target)
|
||||
|
||||
var/hitx
|
||||
@@ -356,6 +359,8 @@
|
||||
pixel_move(1, FALSE)
|
||||
|
||||
/obj/item/projectile/proc/fire(angle, atom/direct_target)
|
||||
if(fired_from)
|
||||
SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original)
|
||||
//If no angle needs to resolve it from xo/yo!
|
||||
if(!log_override && firer && original)
|
||||
log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]")
|
||||
|
||||
@@ -338,7 +338,7 @@
|
||||
/obj/item/organ/eyes/robotic/glow/proc/start_visuals()
|
||||
if(!islist(eye_lighting))
|
||||
regenerate_light_effects()
|
||||
if((eye_lighting.len < light_beam_distance) || !on_mob)
|
||||
if((LAZYLEN(eye_lighting) < light_beam_distance) || !on_mob)
|
||||
regenerate_light_effects()
|
||||
sync_light_effects()
|
||||
update_visuals()
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
return TRUE
|
||||
if(iscyborg(user) && user.a_intent != INTENT_HARM) //to save asimov borgs a LOT of heartache
|
||||
return TRUE
|
||||
if(tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it
|
||||
if(tool && tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it
|
||||
to_chat(user, "<span class='warning'>This step requires a different tool!</span>")
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
|
||||
/obj/belly/Destroy()
|
||||
SSbellies.belly_list -= src
|
||||
if(owner)
|
||||
if(owner?.vore_organs)
|
||||
owner.vore_organs -= src
|
||||
owner = null
|
||||
. = ..()
|
||||
|
||||
Reference in New Issue
Block a user