diff --git a/code/game/objects/items/weapons/capture_crystal.dm b/code/game/objects/items/weapons/capture_crystal.dm
index aada12a941..5523ad8d1e 100644
--- a/code/game/objects/items/weapons/capture_crystal.dm
+++ b/code/game/objects/items/weapons/capture_crystal.dm
@@ -131,6 +131,8 @@
icon_state = empty_icon
if(!cooldown_check())
icon_state = "[icon_state]-busy"
+ spawn(activate_cooldown) //If it's busy then we want to wait a bit to fix the sprite after the cooldown is done.
+ update_icon()
/obj/item/capture_crystal/proc/cooldown_check()
if(world.time < last_activate + activate_cooldown)
@@ -193,19 +195,47 @@
desc = "A glowing crystal in what appears to be some kind of steel housing."
//Determines the capture chance! So you can't capture AI mobs if they're perfectly healthy and all that
-/obj/item/capture_crystal/proc/capture_chance(mob/living/M)
- var/capture_chance = ((1 - (M.health / M.maxHealth)) * 100)
- if(capture_chance_modifier >= 100)
+/obj/item/capture_crystal/proc/capture_chance(mob/living/M, user)
+ if(capture_chance_modifier >= 100) //Master crystal always work
return 100
- capture_chance *= capture_chance_modifier
+ var/capture_chance = ((1 - (M.health / M.maxHealth)) * 100) //Inverted health percent! 100% = 0%
+ //So I don't know how this works but here's a kind of explanation
+ //Basic chance + ((Mob's max health - minimum calculated health) / (Max allowed health - Min allowed health)*(Chance at Max allowed health - Chance at minimum allowed health)
+ capture_chance += 35 + ((M.maxHealth - 5)/ (1000-5)*(-100 - 35))
+ //Basically! Mobs over 1000 max health will be unable to be caught without using status effects.
+ //Thanks Aronai!
+ var/effect_count = 0 //This will give you a smol chance to capture if you have applied status effects, even if the chance would ordinarily be <0
if(M.stat == UNCONSCIOUS)
- capture_chance += 10
+ capture_chance += 0.1
+ effect_count += 1
else if(M.stat == CONSCIOUS)
- capture_chance -= 25
+ capture_chance *= 0.9
else
capture_chance = 0
+ if(M.weakened) //Haha you fall down
+ capture_chance += 0.1
+ effect_count += 1
+ if(M.stunned) //What's the matter???
+ capture_chance += 0.1
+ effect_count += 1
+ if(M.on_fire) //AAAAAAAA
+ capture_chance += 0.1
+ effect_count += 1
+ if(M.paralysis) //Oh noooo
+ capture_chance += 0.1
+ effect_count += 1
+ if(M.ai_holder.stance == STANCE_IDLE) //SNEAK ATTACK???
+ capture_chance += 0.1
+ effect_count += 1
+
+ capture_chance *= capture_chance_modifier
+
if(capture_chance <= 0)
- capture_chance = 0
+ capture_chance = 0 + effect_count
+ if(capture_chance <= 0)
+ capture_chance = 0
+ to_chat(user, "There's no chance... It needs to be weaker.")
+
last_activate = world.time
return capture_chance
@@ -261,30 +291,37 @@
if(isliving(target)) //So we don't have a mob, let's try to claim one! Is the target a mob?
var/mob/living/M = target
last_activate = world.time
+ if(M.capture_caught) //Can't capture things that were already caught.
+ playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
+ to_chat(user, "\The [src] clicks unsatisfyingly... \The [M] is already under someone else's control.")
+ update_icon()
+ return
if(M.stat == DEAD) //Is it dead? We can't influence dead things.
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
to_chat(user, "\The [src] clicks unsatisfyingly... \The [M] is not in a state to be captured.")
+ update_icon()
return
if(M.client) //Is it player controlled?
capture_player(M, user) //We have to do things a little differently if so.
+ update_icon()
return
if(!isanimal(M)) //So it's not player controlled, but it's also not a simplemob?
to_chat(user, "This creature is not suitable for capture.")
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
+ update_icon()
return
var/mob/living/simple_mob/S = M
if(!S.ai_holder) //We don't really want to capture simplemobs that don't have an AI
to_chat(user, "This creature is not suitable for capture.")
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
+ update_icon()
return
- if(prob(capture_chance(S))) //OKAY! So we have an NPC simplemob with an AI, let's calculate its capture chance! It varies based on the mob's condition.
+ if(prob(capture_chance(S, user))) //OKAY! So we have an NPC simplemob with an AI, let's calculate its capture chance! It varies based on the mob's condition.
capture(S, user) //We did it! Woo! We capture it!
user.visible_message("\The [src] clicks, and then emits a small chime.", "Alright! \The [S] was caught!")
recall(user)
active = TRUE
update_icon()
- spawn(activate_cooldown)
- update_icon()
else //Shoot, it didn't work and now it's mad!!!
S.ai_holder.go_wake()
S.ai_holder.target = user
@@ -292,8 +329,6 @@
S.ai_holder.set_stance(STANCE_FIGHT)
user.visible_message("\The [src] bonks into \the [S], angering it!")
update_icon()
- spawn(activate_cooldown)
- update_icon()
return
//The target is not a mob, so let's not do anything.
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
@@ -329,8 +364,6 @@
animate_action(turfmemory)
playsound(src, 'sound/effects/capture-crystal-in.ogg', 75, 1, -1)
update_icon()
- spawn(activate_cooldown) //We wait for the cooldown to go by
- update_icon()
else
to_chat(user, "\The [src] clicks and emits a small, unpleasant tone. \The [bound_mob] cannot be recalled.")
playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
@@ -355,8 +388,6 @@
animate_action(get_turf(bound_mob))
playsound(src, 'sound/effects/capture-crystal-out.ogg', 75, 1, -1)
update_icon()
- spawn(activate_cooldown)
- update_icon()
//Let's make a flashy sparkle when someone appears or disappears!
/obj/item/capture_crystal/proc/animate_action(atom/thing)
@@ -380,7 +411,10 @@
return
if(!cooldown_check()) //OTHERWISE let's obey the cooldown
to_chat(thrower, "\The [src] emits an soft tone... It is not ready yet.")
- playsound(src, 'sound/effects/capture-crystal-problem.ogg', 75, 1, -1)
+ if(bound_mob)
+ playsound(src, 'sound/effects/capture-crystal-problem.ogg', 75, 1, -1)
+ else
+ playsound(src, 'sound/effects/capture-crystal-negative.ogg', 75, 1, -1)
return
if(!active) //The ball isn't set up, let's try to set it up.
if(isliving(target)) //We're hitting a mob, let's try to capture it.
@@ -741,4 +775,4 @@
/mob/living
var/capture_crystal = TRUE //If TRUE, the mob is capturable. Otherwise it isn't.
- var/capture_caught = FALSE
\ No newline at end of file
+ var/capture_caught = FALSE //If TRUE, the mob has already been caught, and so cannot be caught again.
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_mob/overmap_mob_vr.dm b/code/modules/mob/living/simple_mob/overmap_mob_vr.dm
index 8f24506098..bd0b8cf66d 100644
--- a/code/modules/mob/living/simple_mob/overmap_mob_vr.dm
+++ b/code/modules/mob/living/simple_mob/overmap_mob_vr.dm
@@ -84,6 +84,7 @@
name = "DONT SPAWN ME"
desc = "I'm a bad person I'm sorry"
+ faction = "overmap"
low_priority = FALSE
devourable = FALSE
digestable = FALSE
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spacewhale.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spacewhale.dm
index b5807874c3..c54ae5e5a6 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spacewhale.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spacewhale.dm
@@ -1,11 +1,11 @@
/datum/category_item/catalogue/fauna/spacewhale
- name = "Alien Wildlife - Star Treader"
- desc = "A hard shelled creature that lives on asteroids.\
- It is quite durable and very opportunistic in its feeding habits.\
- It is vulnerable to extreme vibrations, and from the bottom."
+ name = "Alien Wildlife - Space Whale"
+ desc = "A massive space creature! These are typically peaceful to anything smaller than themselves, with exception given to space carp, which it eats.\
+ It is known to ravage and devour other large space dwelling species.\
+ It occasionally gets restless and moves around erratically, which may affect the local space weather.\
+ This creature shows no real interest in or aversion to spacecraft."
value = CATALOGUER_REWARD_SUPERHARD
-
/mob/living/simple_mob/vore/overmap/spacewhale
name = "space whale"
desc = "It's a space whale. I don't know what more you expected."
@@ -19,7 +19,6 @@
om_child_type = /obj/effect/overmap/visitable/simplemob/spacewhale
- faction = "space whale"
maxHealth = 100000
health = 100000
movement_cooldown = 50
@@ -82,6 +81,7 @@
vore_active = 1
vore_capacity = 99
vore_bump_chance = 99
+ vore_pounce_chance = 99
vore_ignores_undigestable = 0
vore_default_mode = DM_DIGEST
vore_icons = SA_ICON_LIVING
@@ -91,9 +91,7 @@
vore_default_item_mode = IM_DIGEST
/datum/say_list/spacewhale
- emote_see = list("bobs", "digs around","gnashes at something","yawns","snaps at something")
- emote_hear = list("thrumms","clicks","rattles","groans","burbles")
-
+ emote_see = list("ripples and flows", "flashes rhythmically","glows faintly","investigates something")
/mob/living/simple_mob/vore/overmap/spacewhale/init_vore()
..()