Also, wenn ich richtig begriffen hab, was du möchtest, ist der Fehler glaub ich hier:
MOUSESTATE mx, my, b1, b2
//hier fängst du die Maustasten-Schleife an
IF b1
LOCAL shot AS SHOT
shot.ammo=50
//und erzeugst erst mal nen neuen shot
DIMPUSH shots[], shot
ENDIF
//hier ist die Schleife zu Ende
//und hier werden dann AUSSERHALB der Maustasten-Schleife die ammos runtergezählt!
//Dieser Teil wird im Programm immer erreicht, auch ohne Mausklick!
FOREACH shot IN shots[]
shot.ammo=shot.ammo-1
PRINT shot.ammo, 200, 200
NEXT
Wenn ich deinen Code richtig begriffen habe, dann müßte das Ganze eher so aussehen:
MOUSESTATE mx, my, b1, b2
IF b1
LOCAL shot AS SHOT
shot.ammo=50
DIMPUSH shots[], shot
FOREACH shot IN shots[]
DEC shot.ammo, 1
PRINT shot.ammo, 200, 200
NEXT[
ENDIF
Das Problem ist nur, dass du mit deinem Code nicht nur bei jedem Mausklick eine ammo runterzählst, sondern gleichzeitig auch noch einen neuen shot erzeugst. Ist das so gewünscht? Denn die ammo-Variable wird ja jedesmal an exakt der gleichen Stelle ausgegegeb, und so schnell, wie das passiert, siehst du eh immer nur die Angabe für den letzten shot.