diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm
index cceac22c37f..bdf12eb887b 100644
--- a/code/defines/procs/helpers.dm
+++ b/code/defines/procs/helpers.dm
@@ -1426,3 +1426,10 @@ proc/listclearnulls(list/list)
for(var/obj/O in doors)
O:update_nearby_tiles(1)
+
+
+proc/get_cardinal_dir(atom/A, atom/B)
+ var/dx = abs(B.x - A.x)
+ var/dy = abs(B.y - A.y)
+ return get_dir(A, B) & (rand() * (dx+dy) < dy ? 3 : 12)
+
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index b48b8d22935..d86c1c7c22b 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -55,7 +55,7 @@
///////////////////////////////////////////////////////////////////////////////
/datum/game_mode/revolution/pre_setup()
var/list/datum/mind/possible_headrevs = get_players_for_role(BE_REV)
-
+
for (var/i=1 to max_headrevs)
if (possible_headrevs.len==0)
break
@@ -64,7 +64,7 @@
head_revolutionaries += lenin
var/mob/new_player/player = lenin.current
player.jobs_restricted_by_gamemode = list("Security Officer", "Warden", "Detective")+nonhuman_positions+head_positions
-
+
if(head_revolutionaries.len==0)
return 0
@@ -127,7 +127,7 @@
if(!istype(mob))
return
var/obj/item/device/flash/T = new(mob)
-
+
var/list/slots = list (
"backpack" = mob.slot_in_backpack,
"left pocket" = mob.slot_l_store,
diff --git a/code/game/jobs/jobprocs.dm b/code/game/jobs/jobprocs.dm
index 74fd970d4dc..78aec5b88b0 100644
--- a/code/game/jobs/jobprocs.dm
+++ b/code/game/jobs/jobprocs.dm
@@ -97,6 +97,11 @@
while (unassigned.len && vacancies.len)
var/mob/new_player/candidate = pick_n_take(unassigned)
var/occupation = pick_n_take(vacancies)
+
+ if(candidate.jobs_restricted_by_gamemode)
+ if(occupation in candidate.jobs_restricted_by_gamemode)
+ continue
+
candidate.mind.assigned_role = occupation
for (var/mob/new_player/player in unassigned)
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 0171512d807..62471a68eed 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -474,7 +474,11 @@ Neutralize All Unidentified Life Signs: []
"},
else
// Shooting Code:
var/obj/item/weapon/gun/energy/E=new installation
- playsound(src.loc, E.fire_sound, 75, 1)
+
+ if(!E.silenced)
+ playsound(src.loc, E.fire_sound, 75, 1)
+ else
+ playsound(src.loc, E.fire_sound, 10, 1)
// All energy-based weapons are applicable
if (istype(E, /obj/item/weapon/gun/energy/laser))
@@ -496,7 +500,7 @@ Neutralize All Unidentified Life Signs: []
"},
if(!emagged) use_power(700)
else use_power(1400)
- else if(istype(E, /obj/item/weapon/gun/energy/taser))
+ else if(istype(E, /obj/item/weapon/gun/energy/taser) || istype(E, /obj/item/weapon/gun/energy/stunrevolver))
A = new /obj/item/projectile/electrode( loc )
icon_state = "target_prism"
if(!emagged) use_power(200)
@@ -511,6 +515,48 @@ Neutralize All Unidentified Life Signs: []
"},
if(!emagged) use_power(300)
else use_power(600)
+ else if(istype(E, /obj/item/weapon/gun/energy/lasercannon))
+ A = new /obj/item/projectile/heavylaser( loc )
+ A.original = target.loc
+ icon_state = "orange_target_prism"
+ if(!emagged) use_power(600)
+ else use_power(1200)
+
+ else if(istype(E, /obj/item/weapon/gun/energy/heavylasercannon))
+ A = new /obj/item/projectile/deathlaser( loc )
+ A.original = target.loc
+ icon_state = "orange_target_prism"
+ if(!emagged) use_power(800)
+ else use_power(1600)
+
+ else if(istype(E, /obj/item/weapon/gun/energy/shockgun))
+ A = new /obj/item/projectile/fireball( loc )
+ A.original = target.loc
+ icon_state = "orange_target_prism"
+ if(!emagged) use_power(500)
+ else use_power(1000)
+
+ else if(istype(E, /obj/item/weapon/gun/energy/decloner))
+ A = new /obj/item/projectile/declone( loc )
+ A.original = target.loc
+ icon_state = "orange_target_prism"
+ if(!emagged) use_power(600)
+ else use_power(1200)
+
+ else if(istype(E, /obj/item/weapon/gun/energy/crossbow))
+ A = new /obj/item/projectile/bolt( loc )
+ A.original = target.loc
+ icon_state = "orange_target_prism"
+ if(!emagged) use_power(50)
+ else use_power(100)
+
+ else if(istype(E, /obj/item/weapon/gun/energy/largecrossbow))
+ A = new /obj/item/projectile/largebolt( loc )
+ A.original = target.loc
+ icon_state = "orange_target_prism"
+ if(!emagged) use_power(125)
+ else use_power(250)
+
else // Energy gun shots
if(!emagged) // if it hasn't been emagged, it uses normal taser shots
diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm
index 765be368995..f8dc3c75172 100644
--- a/code/game/objects/items/item.dm
+++ b/code/game/objects/items/item.dm
@@ -13,7 +13,21 @@
return
/obj/item/proc/dropped(mob/user as mob)
- return
+ ..()
+
+ // So you can't drop the Offhand
+ if(istype(src, /obj/item/weapon/offhand))
+ user.drop_item(src)
+
+ var/obj/item/O_r = user.r_hand
+ var/obj/item/O_l = user.l_hand
+ if(O_r.twohanded)
+ if(O_r.wielded)
+ user.drop_item(O_r)
+ if(O_l.twohanded)
+ if(O_l.wielded)
+ user.drop_item(O_l)
+ del(src)
// called just as an item is picked up (loc is not yet changed)
/obj/item/proc/pickup(mob/user)
diff --git a/code/game/objects/items/weapons/guns_new.dm b/code/game/objects/items/weapons/guns_new.dm
index 721b7bb9572..4af9217c457 100644
--- a/code/game/objects/items/weapons/guns_new.dm
+++ b/code/game/objects/items/weapons/guns_new.dm
@@ -101,12 +101,14 @@
icon_state = "heavylaser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 60
- mobdamage = list(BRUTE = 0, BURN = 60, TOX = 0, OXY = 0, CLONE = 0)
+ mobdamage = list(BRUTE = 10, BURN = 60, TOX = 0, OXY = 0, CLONE = 0)
flag = "laser"
New()
..()
effects["eyeblur"] = 20
effectprob["eyeblur"] = 100
+ effects["weak"] = 5
+ effectprob["weak"] = 15
fireball
name = "shock"
@@ -127,8 +129,12 @@
icon_state = "declone"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
damage = 0
- mobdamage = list(BRUTE = 0, BURN = 0, TOX = 0, OXY = 0, CLONE = 70)
+ mobdamage = list(BRUTE = 0, BURN = 0, TOX = 0, OXY = 0, CLONE = 40)
flag = "bio"
+ New()
+ ..()
+ effects["radiation"] = 70
+ effectmod["radiation"] = ADD
dart
name = "dart"
@@ -1041,9 +1047,9 @@
return 0
switch(mode)
if(0)
- in_chamber = new /obj/item/projectile/beam(src)
- if(1)
in_chamber = new /obj/item/projectile/heavylaser(src)
+ if(1)
+ in_chamber = new /obj/item/projectile/beam(src)
power_supply.use(charge_cost)
return 1
@@ -1076,9 +1082,9 @@
return 0
switch(mode)
if(0)
- in_chamber = new /obj/item/projectile/beam(src)
- if(1)
in_chamber = new /obj/item/projectile/heavylaser(src)
+ if(1)
+ in_chamber = new /obj/item/projectile/beam(src)
power_supply.use(charge_cost)
return 1
@@ -1123,8 +1129,8 @@
power_supply.give(power_supply.maxcharge)
decloner
- name = "decloner"
- desc = "A high tech energy weapon that declones a target."
+ name = "biological demolecularisor"
+ desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
icon_state = "decloner"
fire_sound = 'pulse3.ogg'
origin_tech = "combat=5;materials=4;powerstorage=3"
diff --git a/code/game/throwing.dm b/code/game/throwing.dm
index 91b56933d8d..958f3bd93a4 100644
--- a/code/game/throwing.dm
+++ b/code/game/throwing.dm
@@ -33,6 +33,8 @@
else
var/obj/item/weapon/offhand/O = l_hand
del O
+
+ IT.wielded = 0
IT.name = initial(IT.name)
diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm
index dda691484a3..677a583e8a0 100644
--- a/code/modules/mob/living/carbon/metroid/life.dm
+++ b/code/modules/mob/living/carbon/metroid/life.dm
@@ -240,7 +240,8 @@
sleep(10)
Atkcool = 0
- Target.attack_metroid(src)
+ if(get_obstacle_ok(Target))
+ Target.attack_metroid(src)
if(prob(30))
@@ -255,7 +256,8 @@
else
if(Target in view(30, src))
- step_to(src, Target)
+ if(get_obstacle_ok(Target))
+ step_to(src, Target)
else
Target = null
diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm
index 8a325817f3a..77ff9a23801 100644
--- a/code/modules/mob/living/carbon/metroid/metroid.dm
+++ b/code/modules/mob/living/carbon/metroid/metroid.dm
@@ -677,4 +677,83 @@ mob/living/carbon/metroid/var/temperature_resistance = T0C+75
health = 200
else
health = 150
- stat = 0
\ No newline at end of file
+ stat = 0
+
+
+/mob/living/carbon/metroid/proc/get_obstacle_ok(atom/A)
+ var/direct = get_dir(src, A)
+ var/obj/item/weapon/dummy/D = new /obj/item/weapon/dummy( src.loc )
+ var/ok = 0
+ if ( (direct - 1) & direct)
+ var/turf/Step_1
+ var/turf/Step_2
+ switch(direct)
+ if(5.0)
+ Step_1 = get_step(src, NORTH)
+ Step_2 = get_step(src, EAST)
+
+ if(6.0)
+ Step_1 = get_step(src, SOUTH)
+ Step_2 = get_step(src, EAST)
+
+ if(9.0)
+ Step_1 = get_step(src, NORTH)
+ Step_2 = get_step(src, WEST)
+
+ if(10.0)
+ Step_1 = get_step(src, SOUTH)
+ Step_2 = get_step(src, WEST)
+
+ else
+ if(Step_1 && Step_2)
+ var/check_1 = 0
+ var/check_2 = 0
+ if(step_to(D, Step_1))
+ check_1 = 1
+ for(var/obj/border_obstacle in Step_1)
+ if(border_obstacle.flags & ON_BORDER)
+ if(!border_obstacle.CheckExit(D, A))
+ check_1 = 0
+ for(var/obj/border_obstacle in get_turf(A))
+ if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle))
+ if(!border_obstacle.CanPass(D, D.loc, 1, 0))
+ check_1 = 0
+
+ D.loc = src.loc
+ if(step_to(D, Step_2))
+ check_2 = 1
+
+ for(var/obj/border_obstacle in Step_2)
+ if(border_obstacle.flags & ON_BORDER)
+ if(!border_obstacle.CheckExit(D, A))
+ check_2 = 0
+ for(var/obj/border_obstacle in get_turf(A))
+ if((border_obstacle.flags & ON_BORDER) && (src != border_obstacle))
+ if(!border_obstacle.CanPass(D, D.loc, 1, 0))
+ check_2 = 0
+ if(check_1 || check_2)
+ ok = 1
+ else
+ if(loc == src.loc)
+ ok = 1
+ else
+ ok = 1
+
+ //Now, check objects to block exit that are on the border
+ for(var/obj/border_obstacle in src.loc)
+ if(border_obstacle.flags & ON_BORDER)
+ if(!border_obstacle.CheckExit(D, A))
+ ok = 0
+
+ //Next, check objects to block entry that are on the border
+ for(var/obj/border_obstacle in get_turf(A))
+ if((border_obstacle.flags & ON_BORDER) && (A != border_obstacle))
+ if(!border_obstacle.CanPass(D, D.loc, 1, 0))
+ ok = 0
+
+ del(D)
+ if (!( ok ))
+
+ return 0
+
+ return 1
\ No newline at end of file
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 88d765119f5..49900a11926 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 18ecff2bc8f..90ff21375cb 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ