ID:2284095
 
(See the best response by Ter13.)
The game freezes.
Do windows and flaps work? Yes
Stop responding? No
Chash? No

Time to freeze: 2 minutes
Cpu < 5%
Tick_usage < 4
Fps = 10
Tick_lag = 1

mob/proc/ver_vida_Lop(obj/o)
var/percentbar=100
o.loc=src.loc; o.dir=src.dir
o.overlays-='h100.dmi';o.overlays-='h95.dmi'
o.overlays-='h90.dmi'; o.overlays-='h85.dmi'
o.overlays-='h80.dmi'; o.overlays-='h75.dmi'
o.overlays-='h70.dmi'; o.overlays-='h65.dmi'
o.overlays-='h60.dmi'; o.overlays-='h55.dmi'
o.overlays-='h50.dmi'; o.overlays-='h45.dmi'
o.overlays-='h40.dmi'; o.overlays-='h35.dmi'
o.overlays-='h30.dmi'; o.overlays-='h25.dmi'
o.overlays-='h20.dmi'; o.overlays-='h15.dmi'
o.overlays-='h10.dmi'
o.overlays-='h5.dmi'

if(maxhealth>1) percentbar=round(src.health/src.maxhealth*100,5)
else percentbar=1

if(percentbar<5) percentbar=5
if(percentbar>100) percentbar=100

if(src.icon!='invis.dmi') switch(percentbar)
if(100)o.ovl+='h100.dmi'
if(95) o.ovl+='h95.dmi'
if(90) o.ovl+='h90.dmi'
if(85) o.ovl+='h85.dmi'
if(80) o.ovl+='h80.dmi'
if(75) o.ovl+='h75.dmi'
if(70) o.ovl+='h70.dmi'
if(65) o.ovl+='h65.dmi'
if(60) o.ovl+='h60.dmi'
if(55) o.ovl+='h55.dmi'
if(50) o.ovl+='h50.dmi'
if(45) o.ovl+='h45.dmi'
if(40) o.ovl+='h40.dmi'
if(35) o.ovl+='h35.dmi'
if(30) o.ovl+='h30.dmi'
if(25) o.ovl+='h25.dmi'
if(20) o.ovl+='h20.dmi'
if(15) o.ovl+='h15.dmi'
if(10) o.ovl+='h10.dmi'
if(5) o.ovl+='h5.dmi'

sleep(1)
src.ver_vida_Lop(o)

mob/proc/ver_vida()
var/obj/o=new
src.objvida=o
o.Gowner=src
o.pixel_y=-4
o.pixel_x=6
sleep(10)
src.ver_vida_Lop(o)


Problem description:

runtime error: Maximum recursion level reached (perhaps there is an infinite loop)
To avoid this safety check, set world.loop_checks=0.
proc name: ver vida Lop (/mob/proc/ver_vida_Lop)
usr: (src)
src: Vvbcvc (/mob/Player)
src.loc: (37,11,189) (/turf/Academia/Turf)
call stack:
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
...
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): ver vida Lop(the obj (/obj))
Vvbcvc (/mob/Player): Load1()



</4></5>
It tells you what's happening and how to fix it :P

world/loop_checks = FALSE
Kozuma, thanks for being quick, I have to leave soon ...
I tried, it still freezes in 2 minutes. Errors.log Only Does Not Show After. (Loops_check = false

With (while) I did not give it, but I want to proc call proc

I put overlays effect battle on obj
Best response
mob/proc/ver_vida_Lop(obj/o)
while(o.Gowner)
var/percentbar=100
o.loc=src.loc; o.dir=src.dir
o.overlays-='h100.dmi';o.overlays-='h95.dmi'
o.overlays-='h90.dmi'; o.overlays-='h85.dmi'
o.overlays-='h80.dmi'; o.overlays-='h75.dmi'
o.overlays-='h70.dmi'; o.overlays-='h65.dmi'
o.overlays-='h60.dmi'; o.overlays-='h55.dmi'
o.overlays-='h50.dmi'; o.overlays-='h45.dmi'
o.overlays-='h40.dmi'; o.overlays-='h35.dmi'
o.overlays-='h30.dmi'; o.overlays-='h25.dmi'
o.overlays-='h20.dmi'; o.overlays-='h15.dmi'
o.overlays-='h10.dmi'
o.overlays-='h5.dmi'

if(maxhealth>1) percentbar=round(src.health/src.maxhealth*100,5)
else percentbar=1

if(percentbar<5) percentbar=5
if(percentbar>100) percentbar=100

if(src.icon!='invis.dmi') switch(percentbar)
if(100)o.ovl+='h100.dmi'
if(95) o.ovl+='h95.dmi'
if(90) o.ovl+='h90.dmi'
if(85) o.ovl+='h85.dmi'
if(80) o.ovl+='h80.dmi'
if(75) o.ovl+='h75.dmi'
if(70) o.ovl+='h70.dmi'
if(65) o.ovl+='h65.dmi'
if(60) o.ovl+='h60.dmi'
if(55) o.ovl+='h55.dmi'
if(50) o.ovl+='h50.dmi'
if(45) o.ovl+='h45.dmi'
if(40) o.ovl+='h40.dmi'
if(35) o.ovl+='h35.dmi'
if(30) o.ovl+='h30.dmi'
if(25) o.ovl+='h25.dmi'
if(20) o.ovl+='h20.dmi'
if(15) o.ovl+='h15.dmi'
if(10) o.ovl+='h10.dmi'
if(5) o.ovl+='h5.dmi'

sleep(1)


The problem is recursion. You can't call a proc within itself too many times or the call chain will crash out. You need to be using a while loop. They are designed to repeat code indefinitely. Recursion is not.

Also, holy shit you are doing way more work than you have to.

Jam all 20 of your icons into a single icon. Name the states 100, 95, 90, etc.

mob
var
obj/healthbar

Move()
healthbar.glide_size = glide_size
. = ..()
healthbar.loc = loc


proc
healthUpdate()
set waitfor = 0
while(healthbar)
var/percent = maxhealth ? round(min(max(health / maxhealth,0),1) * 100,5) : 0
healthbar.icon_state = "[percent]"
if(healthbar.loc!=loc)
healthbar.loc = loc
sleep(1)

InitHealthbar()
healthbar = new/obj{icon='healthbar.dmi';pixel_y=-4;pixel_x=6}()
healthbar.Gowner = src
healthUpdate()


That huge switch is a waste of processing power, and your time to write. Removing 20 different overlays from an icon every single time you want to update it just doesn't need to be done at all.
With 40 online cpu is 27% with this same code but used with while. It's heavy but not for that much. It's practical !
It's practical !

It's not.

There is literally no reason to be removing 20 overlays at a time when you could either be storing the appearance of the overlay for later removal, or you could be using a single icon with 20 icon states and changing the icon_state.
I already did the exchange, I wanted to proc proc call to see calls in profile. Much lighter now