Aller à la page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
Reprise du message précédent:
1mag0 -
posté le 08/12/2012 à 01:00:05 (794 messages postés)
| Dessinateur amateur | Support : RPG Maker XP
Question 1 : Pas facile à expliquer ... Quel script modifier pour que mon "characters" (personnage en exploration) soit entièrement "bloquable" (des pieds à la tête) ou soit bloquable sur un carré de 64 pixels de coté et pas seulement un carré de 32 pixels de coté en bas du charac (symbolisant les pieds).
Sinon le site http://www.rpgrevolution.com/rgss-script-ref/ est pas mal pour décortiqué quelque généralités!
|
Ma galerie / Les Alt-code / Nouveau screen dans ma galerie! (mars 2019 réédit) | Suite du sujet:
Estheone -
posté le 08/12/2012 à 08:54:28 (312 messages postés)
| | Je suis pas sûr à 100% d'avoir compris ce que tu veux mais c'est juste pour bloquer le perso joueur sur un rectangle de 32*64 (les pieds et le carreau au dessus donc) tu as juste à remplacer la fonction passable? de la classe Game_Player par celle-là :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
def passable?(x, y, d)
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
if not $game_map.valid?(new_x, new_y) or not $game_map.valid?(new_x, new_y-1)
return false
end
if $DEBUG and Input.press?(Input::CTRL)
return true
end
if @through
return true
end
if not $game_map.passable?(x, y, d, self) or not $game_map.passable?(x, y-1, d, self)
return false
end
if not $game_map.passable?(new_x, new_y, 10 - d) or not $game_map.passable?(new_x, new_y-1, 10 - d)
return false
end
for event in $game_map.events.values
if event.x == new_x and (event.y == new_y or event.y == new_y-1)
unless event.through
if self != $game_player
return false
end
if event.character_name != ""
return false
end
end
end
end
if $game_player.x == new_x and $game_player.y == new_y
unless $game_player.through
if @character_name != ""
return false
end
end
end
return true
end
|
C'est la solution du pauvre par contre et ça ne s'applique qu'au joueur, pas aux autres events.
|
Wandering Souls : Jeu complet / Topic sur Oniro |
1mag0 -
posté le 10/12/2012 à 00:59:21 (794 messages postés)
| Dessinateur amateur | C'est exactement ça sauf que c'était 64 pixels par 64. Mais ce n'est pas grave en trifouillant un peu ça sera surement possible. Ou sans bidouille dans le script je peux jouer sur le panorama et réservé une couche pour gérer les passages. Merci quand même! mieux vos avoir 2 méthodes sous le coude!
Edit pour le blocage du personnage en exploration: ou sinon existe il un moyen de centrer le carreaux de blocage? Par défaut il est centré milleu à l'horizontal mais pas à la verticale? Car avec le script donné il dédouble la ligne de blocage si je déchiffre bien.
Edit pour esziaprez: euh les 2 sont assez complexe alors soit tu met les mains dans le ruby et tu va galérer quelque mois surement soit tu fait quelque chose de plus simple mais mieux maitriser. Après tu peux toujours faire des graphique "style" 2D iso avec un déplacement en damier classique.
|
Ma galerie / Les Alt-code / Nouveau screen dans ma galerie! (mars 2019 réédit) |
| Je suis dans le game ! | C'est possible de combiner un script de 2D iso avec un autre de A rpg ?
|
Projet en cours: INRAL / En pause :NEOTORI /// Pause : L'ANKH DE KINBRA /// Pause : GRASS SHOPPER /// GALERIE |
Estheone -
posté le 10/12/2012 à 10:00:31 (312 messages postés)
| | Citation: C'est exactement ça sauf que c'était 64 pixels par 64. |
Le problème c'est qu'un blocage de 64*64 centré n'a aucun sens si on conserve le système de déplacement de base carreau par carreau.
Soit tu bloques sur 96*96 centré (mais je suppose que c'est trop, et ça va poser d'autres problèmes), soit tu bloques sur 64*64 excentré (nécessite de modifier ton sprite pour qu'il soit décalé, et ça posera des problèmes de déclenchement d'events), soit tu modifies les scripts pour du déplacement en demi-carreau et tu peux faire du 64*64 centré (mais la ça devient tendu niveau prog).
Bref malheureusement t'as pas vraiment de solution miracle.
|
Wandering Souls : Jeu complet / Topic sur Oniro |
1mag0 -
posté le 10/12/2012 à 23:12:37 (794 messages postés)
| Dessinateur amateur | C'est pour cela que, j'ai une préférence pour le carreau de blocage, centré en vertical et horizontal, de 32 pixels de coté (ha mince j'avais oublié de préciser plus haut) et une couche réserver au déplacement. Effectivement ça devient vite compliqué avec du carreau de 64 et 96 pixels de coté. J'ai regardé le script Game_Player ça n'a pas l'air d'être ici que le logiciel gère le carreau de blocage .
|
Ma galerie / Les Alt-code / Nouveau screen dans ma galerie! (mars 2019 réédit) |
| Je suis dans le game ! | La quest la plus stupide depuis 400 ans ! Comment ont entre les caractere speciaux dans les string
Non je ne de,ande pas comment entrer vincent macdoom dans ses sous vetement tres fin mais bel et bien comment entrer de ' "/...dans les variable string sans avoir un truc muche
Merci les froufrou !
Je suis gai parceque j ai fini ce qui ressemble a un script...(gai comme content est-il utile de le preciser)
|
Projet en cours: INRAL / En pause :NEOTORI /// Pause : L'ANKH DE KINBRA /// Pause : GRASS SHOPPER /// GALERIE |
arttroy -
posté le 12/12/2012 à 21:44:32 (2394 messages postés)
| Just working | Support :RMVX Ace [Résolu]
Question 1 :
Bonsoir j'aurais aimé savoir comment on rend une partie du menu inaccessible (grisée) parce que je n'arrive pas à trouver...
Je voudrais faire une condition dans ce genre là :
if $data_armors[66] == 0
@command_window.set handler(: skill).enabled = false
end
mais je ne sais pas trop comment faire ni ou placer la condition d'ailleurs
J'ai essayé de regarder dans l'aide mais je ne trouve pas... Et je sais plus trop où chercher dans les scripts, je m'embrouille à force...
Edit : j'ai testé pas mal de trucs en regardant dans les script de base mais je n'arrive à rien personne pour un petit coup de main ?
|
Anti-inconstructivité / Pétition pour que le mot making soit inscrit dans le dictionnaire ? |
Zeus81 -
posté le 14/12/2012 à 17:27:38 (11071 messages postés)
| | Dans Window_MenuCommand tu cherches les add_command, le dernier argument est un booléen pour activer/désactiver.
|
arttroy -
posté le 14/12/2012 à 17:40:21 (2394 messages postés)
| Just working | Merci déjà ça m'as avancé du coup j'ai modifié comme ça :
1
2
3
4
5
6
7
8
9
10
11
12
| #--------------------------------------------------------------------------
# * Add Main Commands to List
#--------------------------------------------------------------------------
def add_main_commands
add_command(Vocab::skill, :skill, main_commands_enabled = false)
add_command(Vocab::equip, :equip, main_commands_enabled = true)
add_command("Soutien", :soutien, main_commands_enabled = false)
add_command(Vocab::status, :status, main_commands_enabled = true)
add_command("Historique", :historique, main_commands_enabled = true)
add_command("Orbe Exodus", :orbe, main_commands_enabled = true)
end
|
L'ennui c'est que si j'essaie de sélectionner skill ou soutien ça m'envoie à l'écran du Scene_End ??? comment ça se fait ?
Edit : Ça doit être à cause de ça...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| def update
super
if Input.trigger?(:DOWN)
@quit_index=true
if @quit_index==true
@sprite_g.visible=true
@command_window.active=false
else
@sprite_g.visible=false
@command_window.active=true
end
elsif Input.trigger?(:UP)
@quit_index=false
@sprite_g.visible=false
@command_window.active=true
end
if @quit_index=true and Input.trigger?(:C)
command_game_end
return
end
update_roue_menu
end
|
Mais du coup comment faire ?
Donc revenons à nos moutons, cette portion de code sert normalement à accéder à la partie game_end parce que je ne voulais pas l'inclure dans ma roue de menu. L'ennui c'est qu'apparement si une commande n'est pas active ("enabled"), le logiciel considère que :
@quit_index=true
D'où mon souci cité plus haut quand j'appuie pour confirmer. Donc si je comprend bien il faut que je modifie cette condition :
1
2
3
4
5
6
| if @quit_index=true and Input.trigger?(:C)
command_game_end
return
end
update_roue_menu
end |
Mais je ne vois vraiment pas comment faire...
Edit : Bon je crois que la seule solution que j'ai, c'est de changer de touche pour le game_end ou pour la confirmation dans le menu... Mais je sais pas laquelle de ces deux solutions serait le plus viable quelqu'un aurait un avis sur le sujet ?
Bon finalement j'ai trouvé comment faire, j'ai modifié la condition par :
if sprite_g.visible = true and Input.trigger?(:C)
Ca fonctionne nickel encore une fois merci à Zeus, son petit coup de main m'a bien aidé !!
|
Anti-inconstructivité / Pétition pour que le mot making soit inscrit dans le dictionnaire ? |
Vyniea -
posté le 29/12/2012 à 22:48:34 (83 messages postés)
| | Support : RMXV Ace
Question : Est-il possible de mettre 0 comme niveau minimum?
J'ai regardé partout dans les scripts et sur le net mais j'ai rien trouvé. Je compte me servir des niveaux comme monnaie d'échange (je vais les renommer '' Point de Capacité '') et c'est plutôt étrange un minimum de 1! J'imagine que c'est possible comme on peu augmenter le niveau max. Quoique peut-être qu'une valeur de 0 pause problème.
Support : RMXV Ace
Problème : Problème avec script
En gros je regardais un tuto video sur le net et j'ai décidé de tester, parce qu'imiter c'est une bonne façon d'apprendre, mais quand je le fais ça fonctionne pas, et a ce que je sache je fais exactement la même chose que le mec dans le video.
J'ai cette erreur : " unexpected ',', expecting keyword_end " sur la ligne 3, et j'imagine la 4 et la 5 vu que c'est la même chose sur les trois
1
2
3
4
5
6
7
| class Window_skillpoints < Window_Command
def make_command_list
add_command|"Item", :item|
add_command|"Skill", :skill|
add_command|"Status", :status|
end
end |
Sinon, si y'a un site qui explique clairement les messages d'erreurs ça serait bien, parce qu'ils sont pas très clair pour un néophyte!
Merci d'avance
|
Berka -
posté le 05/01/2013 à 17:46:20 (493 messages postés)
| planchant sur un script | Vyniea
Pour ton second problème, tu utilises l'opérateur "or" : | à la place des parenthèses. "add_command" est une méthode qui prend deux paramètres. Donc :
1
2
3
4
5
6
7
| class Window_skillpoints < Window_Command
def make_command_list
add_command("Item", :item)
add_command("Skill", :skill)
add_command("Status", :status)
end
end |
Et puis pense à utiliser la notation "camelcase" pour tes noms de classes, c'est la convention :
Window_SkillPoints
Bonne soirée,
Berka
|
Twitter: Pensées politiques et juridiques. Réflexions informatiques |
Estheone -
posté le 05/01/2013 à 18:30:50 (312 messages postés)
| | Citation: Est-il possible de mettre 0 comme niveau minimum? |
Dans le setup du Game_Actor remplace
1
| @level = actor.initial_level |
par
Tous tes persos commenceront au niveau 0 par contre, peu importe la valeur de niveau de départ que tu mettras dans la base de données.
Ensuite rajoute ce script au-dessus du main :
1
2
3
4
5
6
7
8
9
10
11
| class RPG::Class < RPG::BaseItem
def exp_for_level(level)
lv = (level+1).to_f
basis = @exp_params[0].to_f
extra = @exp_params[1].to_f
acc_a = @exp_params[2].to_f
acc_b = @exp_params[3].to_f
return (basis*((lv-1)**(0.9+acc_a/250))*lv*(lv+1)/
(6+lv**2/50/acc_b)+(lv-1)*extra).round.to_i
end
end |
Tu peux remercier Berka, j'avais complètement oublié ce topic.
|
Wandering Souls : Jeu complet / Topic sur Oniro |
Cortez -
posté le 13/01/2013 à 21:10:13 (524 messages postés)
| | Bonjour à tous je repasse sur oniro pour demander un coup de pouce des scripteurs sur un système simple de boussole.
Système concerné : RmXP
Type de demande : Traduction et explication
J'ai trouvé une formule sur le net permetant de calculer à l'aide de 2 points l'angle qui les sépare.
Ceci permet d'obtenir un angle compris entre 0 et 360 et ainsi afficher une image ayant la bonne rotation.
Imaginons un point A (le héros du jeu) positionné en x1 et y1, et un point B (l'objectif), en x2 et y2.
Je souhaite connaître un angle (en degré) afin qu’une aiguille d'une boussole pointe dans la direction du point B.
1
| float a = ((float)(Math.atan2 (y2-y1, x2-x1)*180.0d/Math.PI))+90.0f |
Cependant c'est un code JAVA et j'aimerais qu'un scripteur charitable le traduise en langage ruby et m'explique comment l'utiliser (script audessus de main, insertion de script).
Note: je sais déjà remplacer y2, x2 ... par des
et je dispose d'un moyen pour afficher l'image en fonction d'un angle.
|
Estheone -
posté le 13/01/2013 à 21:21:49 (312 messages postés)
| | En insertion de script :
1
| $game_variables[1] = (Math.atan2($game_variables[5]-$game_variables[4], $game_variables[3]-$game_variables[2])*180.0/Math::PI)+90.0 |
|
Wandering Souls : Jeu complet / Topic sur Oniro |
Cortez -
posté le 13/01/2013 à 21:52:42 (524 messages postés)
| | ok je teste ça tout de suite.
Merci pour la réponse rapide.
|
TheZalera -
posté le 01/02/2013 à 20:46:43 (16 messages postés)
| | Support : RM VX ACE
Question 1 :
Je cherche à comprendre utilise se script : Level up item bonus.
Dans le script il est écrit :
1
2
3
4
5
| #==============================================================================
# TO USE:
# Weapon or Armor tag - <stat: +x bonus>
# Where STAT is mhp, mmp, atk, def, mdf, mat, agi, or luk, and X is an integer.
#============================================================================== |
Je débute quelque peux et je n'ai pas trouver comment ajouter ce "tag".
|
TheZalera -
posté le 01/02/2013 à 21:33:00 (16 messages postés)
| | j'y vais à l'aveuglette du coup j'y connais rien :/
Edit : je te remercie j'ai compris le fonctionnement. Par exemple mettre <mhp: +10 bonus> pour gagner 10 hp par level up avec l'arme équipé. A insérer dans la fenetre de note de l'objet en question.
|
Nelfe -
posté le 07/02/2013 à 17:00:29 (3 messages postés)
| | Support : RM VX Ace
Question 1 :
J'aimerais faire un sorte qu'un message apparaisse lorsque le joueur se trouve sur une case (et idéalement que le sprite soit dirigé vers le bas).
Pour ce qui est du message pas de problème, la détection de l'orientation du sprite est faisable aussi si je dis pas de bêtises, mais je n'arrive pas à trouver comment faire la détection : j'ai utilisé les trigger Player touch et Event touch, mais le premier ne fonctionne que quand on colle la case (or je veux que ça soit quand on soit dessus), le second ne semble rien faire.
Merci aux âmes charitables
|
arttroy -
posté le 07/02/2013 à 18:00:22 (2394 messages postés)
| Just working | Tu as essayé l'option "sous le héros" pour ton event en priorité d'affichage ? Combiné avec l'option "player touch" ça devrait le faire. Ou alors il faut que tu gère avec des variables, il y a un tutoriel là dessus de Joke (tous les autres du même auteur sont pas mal aussi) ici :
http://www.rpg-maker.fr/tutoriels-176-joke-s-tuts-5-base-de-programmation-les-zones-par-variables-.html
Sinon ici c'est plus pour les questions de programmation (les scripts... la puissance ultime de rpg maker...) pour ce que tu veux toi c'est le domaine des events, à ne pas confondre...
Le plus simple quand tu as un souci, c'est de faire un screen de ce que tu as déjà fait, ça aide beaucoup fais moi confiance !
Sinon vu le faible nombre de messages à ton actif, je te souhaite la bienvenue chez nous et bon courage dans la découverte de ce fabuleux logiciel !
|
Anti-inconstructivité / Pétition pour que le mot making soit inscrit dans le dictionnaire ? |
ratorix -
posté le 11/02/2013 à 01:42:28 (99 messages postés)
| | Support : RMXP
Question 1 :
Bonjour, alors voila, je voudrais savoir comment intégré du texte venant d'un fichier texte (assez long) .
Ce ou ces fichiers, contiendrais l'histoire de chaque personnages et serais intégré à une fenêtre que j'ai déjà rajouté dans le menus "Statue", chaque personnage a sont histoire.
Je n'ai pas trouvé grand chose sur internet concernant les fichier texte, j'avais trouver la description de la commande file.open( "teste.txt", "r"), mais je n'ai pas eu de succès.
J'ai aussi suivit ce tuto même si ce n'est pas toute a fait ce que je veut :
http://www.rpg-maker.fr/tutoriels-268-ruby-ecrire-et-lire-un-fichier.html
Mais j'en reviens toujours au même problème principalement "fichier "teste.txt" introuvable".
Edit : je viens de retrouver (je pensais avoir été assez con pour tout effacé mais je l'avais quand même mis de coté ) le code ou au moins une parti de celui ci, j'ai tout rassembler dans un seul fichier que j'avais mis de coter mais il ce peut que j'avais dispatcher le code entre les script.
désolé si c'est pas trés claire j'avais mis de coter le code juste pour moi a la base.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
| #==============================================================================
# ** Window_Descriptions
#------------------------------------------------------------------------------
# This window displays actor description.
#==============================================================================
class Window_Descriptions < Window_Base
#--------------------------------------------------------------------------
# * Object Initialization
# actor : actor
#--------------------------------------------------------------------------
file = File.open("description.txt", "r")
fichiertexte = file
fichiertexte = fichiertexte.read
fichiertexte = fichiertexte.split(";")
desc01 = fichiertexte[0]
desc02 = fichiertexte[1]
desc03 = fichiertexte[2]
desc04 = fichiertexte[3]
desc05 = fichiertexte[4]
desc06 = fichiertexte[5]
desc07 = fichiertexte[6]
desc08 = fichiertexte[7]
desc09 = fichiertexte[8]
desc01 = desc01.split("=")
@desc01 = desc01[1]
desc02 = desc02.split("=")
@desc02 = desc02[1]
desc03 = desc03.split("=")
@desc03 = desc03[1]
desc04 = desc04.split("=")
@desc04 = desc04[1]
desc05 = desc05.split("=")
@desc05 = desc05[1]
desc06 = desc06.split("=")
@desc06 = desc06[1]
desc07 = desc07.split("=")
@desc07 = desc07[1]
desc08 = desc08.split("=")
@desc08 = desc08[1]
desc09 = desc09.split("=")
@desc09 = desc09[1]
file.close
def initialize(actor)
super(0, 0, 630, 600)
self.contents = Bitmap.new(width - 32, height - 32)
@actor = actor
refresh
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
draw_actor_description(@actor, 400, 112)
end
end
#--------------------------------------------------------------------------
# * Draw description
# actor : actor
# x : draw spot x-coordinate
# y : draw spot y-coordinate
#--------------------------------------------------------------------------
def draw_actor_description(actor, x, y)
descriptionb = fichiertexte[0]
description = RPG::Cache.face(descriptionb)
self.contents.font.color = normal_color
self.contents.draw_text(x, y, 236, 32,description)
file.close
end
|
les desc01 etc corresponde a l'intérieur de mon fichier texte qui étais présenter comme ça :
desc01 = description du premier perso.
desc02 = description du deuxième perso.
etc.
Question 2 :
Elle va avec la première, j'essaye d'anticiper le problème ^^.
Il faudrait aussi (du faite que chaque personnage a sont histoire) que je puisse lier le fichier au personnage, je pense pouvoir trouver une fois le premier problème résolue mais on sait jamais ^^.
|
Ayop -
posté le 11/02/2013 à 15:33:48 (847 messages postés)
| | Désolé ratorix de passer devant toi alors que personne ne t'as encore répondu, mais j'ai aussi besoin d'un coup de main. Ne l'oubliez pas quand même.
Support : RM VX Ace
Question : Alors voilà, j'essaye d'installer quelques scripts pour rendre les déplacement du héros plus cool. Mais j'ai un petit problème.
Donc pour résumer, j'ai installé ces scripts de Victor :
1) Le Victor Engine - Basic Engine : Script ici.
2) Le Rotation Turning (qui permet de faire faire une rotation sur lui même au héros lors d'un demi-tour) : Script ici.
3) Le Pixel Movement (qui ne permet pas le déplacement en diagonale) : Script ici.
4) Le Diagonal Movement (pour pallier au défaut du script précédent) : Script ici.
(Je précise que tous ces script sont du même auteur, Victor donc.
Le problème vient de ce dernier script, Diagonal Movement : Lorsque je lance le jeu, tout va bien, l'écran titre apparait et je peux lancer ma partie. Mais dès que je bouge le héros, dans n'importe quelle directions, ce message d'erreur s'affiche :
Spoiler (cliquez pour afficher)
Alors comme je suis une teub en Ruby, quand j'ai une erreur comme ça, j'efface la ligne. Pour voir.
Donc je relance le jeu, pareil, écran titre, je lance ma partie et là, dès que je bouge mon héros :
Spoiler (cliquez pour afficher)
Donc une fois de plus, j'efface cette ligne et je relance le jeu. Il s'agit de ces deux lignes donc :
1
2
| sy = (index / 4 * 4 + dir) * @ch
self.src_rect.set(sx, sy, @cw, @ch) |
Et là tout marche, même les diagonales, mais sans les animations du héros pendant ces dernières.
Je m'explique : Après avoir effacé ces deux lignes, les quatre directions normales du héros fonctionnent avec tous les script que j'ai installé (pixel par pixel et rotation lors d'un demi tour); mais lors des diagonales, l'animation de marche du héros n'est plus affiché.
Voilà mon petit problème, je ne pense pas que ce soit très dur à régler, mais comme je l'ai dit, je suis vraiment un teub en Ruby. Il faut comprendre par là que je ne connais absolument rien. Donc un peu d'aide ne serait vraiment pas de refus.
Merci beaucoup d'avance à celui qui saura m'aider.
EDIT : Bon, bah je viens aussi de remarquer que la touche action ne marche plus ... A part dans le menu qui lui marche très bien.
Apparemment ça vient du script pixel par pixel, puisque quand je le supprime tout remarche. Je vais voir si je ne peux pas régler ça.
Et après quelques test, j'ai l'impression que ça vient d'une incompatibilité entre le script Pixel Movement de Victor et le Awesome Light Effect de Khas :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
| #-------------------------------------------------------------------------------
# * [ACE] Khas Awesome Light Effects
#-------------------------------------------------------------------------------
# * By Khas Arcthunder - arcthunder.site40.net
# * Version: 1.0 EN
# * Released on: 17/01/2012
#
#-------------------------------------------------------------------------------
# * Terms of Use
#-------------------------------------------------------------------------------
# When using any Khas script, you agree with the following terms:
# 1. You must give credit to Khas;
# 2. All Khas scripts are licensed under a Creative Commons license;
# 3. All Khas scripts are for non-commercial projects. If you need some script
# for your commercial project (I accept requests for this type of project),
# send an email to nilokruch@live.com with your request;
# 4. All Khas scripts are for personal use, you can use or edit for your own
# project, but you are not allowed to post any modified version;
# 5. You can’t give credit to yourself for posting any Khas script;
# 6. If you want to share a Khas script, don’t post the direct download link,
# please redirect the user to arcthunder.site40.net
#
#-------------------------------------------------------------------------------
# * Features
#-------------------------------------------------------------------------------
# - Realistic Light
# - Light does not pass over walls, blocks and roofs
# - Static Light Sources
# - Dynamic Light Sources (like a player's lantern)
# - Multiple effects
# - Easy to use (comments)
#
#-------------------------------------------------------------------------------
# * WARNING - Performance
#-------------------------------------------------------------------------------
# This script may be too heavy to old processors! The Awesome Light Effects was
# tested on a Core 2 Duo E4500 and on a Core i5, without any lag. However,
# there's other factors that may influence the script performance:
#
# 1. Map size
# This script searches surfaces on the map, in order to cut the light pictures.
# In a huge map, the number of surfaces may increase a lot, affecting the
# DYNAMIC LIGHT SOURCE only. Map size does not influence the static sources.
#
# 2. Number of effects
# This script draws the effects on the screen, but before drawing, it checks
# if the effect is out of screen (in this case, the script will skip the
# light drawing). Too much effects may cause lag, but this is just a prevision.
#
# 3. Effect's picture size
# The picture size of the DYNAMIC LIGHT SOURCE influences directly on your
# game's performace. The bigger is the picture, the slower it will be to
# draw it dynamically. The recommended maximum size is 200x200 pixels
#
#-------------------------------------------------------------------------------
# * WARNING - Light pictures
#-------------------------------------------------------------------------------
# In order to run this script correctly, the light pictures MUST obey the
# following conditions:
# 1. The picture's size MUST be multiple of 2. Example: 150x150
# 2. The picture's width MUST be equal to it's height. Example: 156x156
# 3. The picture's colors MUST be inverted! This is necessary because
# the script inverts the colors to draw the effect. The black color
# will be transparent!
#
#-------------------------------------------------------------------------------
# * Instructions - 1. Setup your effects!
#-------------------------------------------------------------------------------
# In order to setup your static effects, go to the setup part and define your
# effects inside the Effects hash. Do as the following mode:
#
# X => [picture,opacity,variation,cut], <= Remember to put a comma here!
#
# Where:
# picture => Picture's name, inside the Graphics/Lights folder;
# opacity => Effect's opacity;
# variation => Effect's opacity variation;
# cut => Put true to cut the effect or false to don't;
# X => The effect's ID, it will be used on events.
#
# Check the default effects to understand how they work.
#
#-------------------------------------------------------------------------------
# * Instructions - 2. Use your effects!
#-------------------------------------------------------------------------------
# In order to use a effect, put the following comment on a event:
#
# [light x]
#
# Where x must be the Effect's ID.
#
#-------------------------------------------------------------------------------
# * Instructions - 3. Use an awesome lantern!
#-------------------------------------------------------------------------------
# The dynamic light source (lantern) is initialized invisible by default.
# You may call the following commands:
#
# l = $game_map.lantern
# Gets the lantern into a variable
# l.set_graphic(i)
# Sets the lantern's graphic to i, where i must be the picture's file name on
# Graphics/Lights folder.
#
# l.set_multiple_graphics(h)
# Sets the lantern's graphics to h, where h must be a hash with the following
# structure:
#
# h = {2=>"ld",4=>"ll",6=>"lr",8=>"lu"}
#
# Where:
# "ld" is the name of the picture when the lantern's owner is looking down;
# "ll" is the name of the picture when the lantern's owner is looking left;
# "lr" is the name of the picture when the lantern's owner is looking right;
# "lu" is the name of the picture when the lantern's owner is looking up.
#
# l.change_owner(char)
# Sets the lantern's owner to char. Char must be ONE of the following commands:
# $game_player <= The player itself;
# self_event <= The event where the command was called;
# $game_map.events[x] <= The event ID x.
#
# l.set_opacity(o,p)
# Sets the lantern's opacity, where:
# o is the opacity itself;
# p is the opacity variation.
#
# l.show
# After setting the lantern with the commands above, you may set it to visible
# using this command.
#
# l.hide
# Use this command to set the lantern as invisible.
#
#-------------------------------------------------------------------------------
# * Instructions - 4. Use the effect's surface!
#-------------------------------------------------------------------------------
# The Awesome Light Effects draws the effects on a surface. In order to make
# the effects visible, the effect's surface MUST be visible. The Effect's
# Surface is initialized with it's opacity set to zero. You can call the
# following commands:
#
# s = $game_map.effect_surface
# Gets the Effect's Surface into a variable
#
# s.set_color(r,g,b)
# Changes the Effect's Surface color instantly, where:
# r => red level;
# g => green level;
# b => blue level;
#
# s.set_alpha(a)
# Changes the Effect's Surface opacity instantly to a.
#
# s.change_color(time,r,g,b)
# Changes the Effect's Surface color ONLY in a certain time, where:
# time => The change's time (frames);
# r => red level;
# g => green level;
# b => blue level;
#
# s.change_color(time,r,g,b,a)
# Changes the Effect's Surface color and it's opacity in a certain time, where:
# time => The change's time (frames);
# r => red level;
# g => green level;
# b => blue level;
# a => opacity
#
# s.change_alpha(time,a)
# Changes the Effect's Surface opacity in a certain time, where:
# time => The change's time (frames);
# a => opacity
#
#-------------------------------------------------------------------------------
# * Instructions - 5. Use the effect's surface with Tone command!
#-------------------------------------------------------------------------------
# You can access the Effect's Surface with the "Screen Tone" command. In order
# to turn this feature on, set the "Surface_UE" constant to true.
#
# If you decided to use this feature, please note some details:
# 1. The colors values must be between 0 and 255;
# 2. The time is in frames;
# 3. The "gray" value will be sent as the opacity value
#
#-------------------------------------------------------------------------------
# * Instructions - 6. Setup your Tileset Tags!
#-------------------------------------------------------------------------------
# In order to cut the effect's picture correctly, there's 3 types of behavior
# for a tile: wall, block and roof. Walls will make shadows as real walls,
# blocks as blocks and roofs as roofs. So, the tileset tags MUST be configured.
# Check the demo to understand how this system works. If the tilesets aren't
# configured correctly, the script won't cut the effects correctly.
#
#-------------------------------------------------------------------------------
# * Setup Part
#-------------------------------------------------------------------------------
module Light_Core
Effects = { # <= DON'T change this!
#-------------------------------------------------------------------------------
# PUT YOUR EFFECTS HERE!
#-------------------------------------------------------------------------------
0 => ["light",255,0,true],
1 => ["torch",200,20,true],
2 => ["torch_m",180,30,true],
3 => ["light_s",255,0,true],
4 => ["lumifen",255,0,true],
5 => ["light",255,50,true],
6 => ["light_m",100,0,true],
#-------------------------------------------------------------------------------
# End of effecs configuration
#-------------------------------------------------------------------------------
} # <= DON'T change this!
# Z coordinate of the Effect's Surface
Surface_Z = 180
# Enable Effect's Surface control by "Screen Tone" command?
Surface_UE = true
# Roof behavior tag
Roof_Tag = 3
# Wall behavior tag
Wall_Tag = 2
# Block behavior tag
Block_Tag = 1
# Don't change this!
ACC = Math.tan(Math::PI/26)
end
#-------------------------------------------------------------------------------
# Script
#-------------------------------------------------------------------------------
module Cache
def self.light(filename)
load_bitmap("Graphics/Lights/", filename)
end
end
module Light_Bitcore
include Light_Core
def self.initialize
@@buffer = {}
Effects.values.each { |effect| Light_Bitcore.push(effect[0])}
end
def self::[](key)
return @@buffer[key]
end
def self.push(key)
return if @@buffer.keys.include?(key)
@@buffer[key] = Cache.light(key)
end
end
Light_Bitcore.initialize
class Light_SSource
attr_reader :real_x
attr_reader :real_y
attr_reader :range
attr_accessor :bitmap
attr_reader :w
attr_reader :h
attr_reader :hs
def initialize(char,bitmap,opacity,plus,hs)
sync(char)
@key = bitmap
@bitmap = Light_Bitcore[@key].clone
@range = @bitmap.width/2
@w = @bitmap.width
@h = @bitmap.height
@mr = @range - 16
@opacity = opacity
@plus = plus
@hs = hs
render if @hs
end
def render
tx = x
ty = y
tsx = x + @range
tsy = y + @range
dr = @range*2
for s in $game_map.surfaces
next if !s.visible?(tsx,tsy) || !s.within?(tx,tx+dr,ty,ty+dr)
s.render_shadow(tx,ty,tsx,tsy,@range,@bitmap)
end
end
def restore
return unless @bitmap.nil?
@bitmap = Light_Bitcore[@key].clone
render if @hs
end
def opacity
@plus == 0 ? @opacity : (@opacity + rand(@plus))
end
def sx
return $game_map.adjust_x(@real_x)*32-@mr
end
def sy
return $game_map.adjust_y(@real_y)*32-@mr
end
def sync(char)
@real_x = char.real_x
@real_y = char.real_y
end
def x
return (@real_x*32 - @mr).to_f
end
def y
return (@real_y*32 - @mr).to_f
end
def dispose
return if @bitmap.nil?
@bitmap.dispose
@bitmap = nil
end
end
class Light_DSource < Light_SSource
attr_reader :bitmap
attr_reader :visible
def initialize
@key = nil
@bitmap = nil
@opacity = 255
@plus = 0
@char = $game_player
@visible = false
end
def set_opacity(o,p)
@opacity = o
@plus = p
end
def set_graphic(sb)
dispose
@key = {2=>sb,4=>sb,6=>sb,8=>sb}
Light_Bitcore.push(sb)
@bitmap = {2=>Light_Bitcore[@key[2]].clone,4=>Light_Bitcore[@key[4]].clone,6=>Light_Bitcore[@key[6]].clone,8=>Light_Bitcore[@key[8]].clone}
@range = @bitmap[2].width/2
@w = @bitmap[2].width
@h = @bitmap[2].height
@mr = @range - 16
end
def set_multiple_graphics(ba)
dispose
@key = ba
@key.values.each {|key| Light_Bitcore.push(key)}
@bitmap = {2=>Light_Bitcore[@key[2]].clone,4=>Light_Bitcore[@key[4]].clone,6=>Light_Bitcore[@key[6]].clone,8=>Light_Bitcore[@key[8]].clone}
@range = @bitmap[2].width/2
@w = @bitmap[2].width
@h = @bitmap[2].height
@mr = @range - 16
end
def get_graphic
return @bitmap[@char.direction].clone
end
def show
return if @bitmap.nil?
@visible = true
end
def hide
@visible = false
end
def restore
return if @key.nil?
@key.values.each {|key| Light_Bitcore.push(key)}
@bitmap = {2=>Light_Bitcore[@key[2]].clone,4=>Light_Bitcore[@key[4]].clone,6=>Light_Bitcore[@key[6]].clone,8=>Light_Bitcore[@key[8]].clone}
end
def dispose
return if @bitmap.nil?
@bitmap.values.each { |b| b.dispose }
@bitmap = nil
end
def change_owner(char)
@char = char
end
def render
end
def sx
return $game_map.adjust_x(@char.real_x)*32-@mr
end
def sy
return $game_map.adjust_y(@char.real_y)*32-@mr
end
def x
return (@char.real_x*32 - @mr).to_f
end
def y
return (@char.real_y*32 - @mr).to_f
end
end
class Light_Surface
def initialize
@ta = @a = 0
@tr = @r = 255
@tg = @g = 255
@tb = @b = 255
@va = @vr = @vg = @vb = 0.0
@timer = 0
end
def refresh
return if @timer == 0
@a += @va
@r += @vr
@g += @vg
@b += @vb
$game_map.light_surface.opacity = @a
@timer -= 1
end
def change_color(time,r,g,b,a=nil)
r = 0 if r < 0; r = 255 if r > 255
g = 0 if g < 0; g = 255 if g > 255
b = 0 if b < 0; b = 255 if b > 255
unless a.nil?
a = 0 if a < 0; a = 255 if a > 255
end
@timer = time
@tr = 255-r
@tg = 255-g
@tb = 255-b
@va = (a.nil? ? 0 : (a-@a).to_f/@timer)
@vr = (@tr - @r).to_f/@timer
@vg = (@tg - @g).to_f/@timer
@vb = (@tb - @b).to_f/@timer
end
def change_alpha(time,a)
a = 0 if a < 0; a = 255 if a > 255
@timer = time
@ta = a
@vr = @vg = @vb = 0.0
@va = (a-@a).to_f/@timer
end
def set_color(r,g,b)
r = 0 if r < 0; r = 255 if r > 255
g = 0 if g < 0; g = 255 if g > 255
b = 0 if b < 0; b = 255 if b > 255
@tr = @r = 255-r
@tg = @g = 255-g
@tb = @b = 255-b
@va = @vr = @vg = @vb = 0.0
@timer = 0
end
def set_alpha(a)
a = 0 if a < 0; a = 255 if a > 255
@ta = @a = a
$game_map.light_surface.opacity = @a
@va = @vr = @vg = @vb = 0.0
@timer = 0
end
def alpha
return @a
end
def color
return Color.new(@r,@g,@b)
end
end
class Game_Map
include Light_Core
attr_accessor :light_surface
attr_accessor :light_sources
attr_accessor :surfaces
attr_accessor :effect_surface
attr_accessor :lantern
alias kbl_setup_events setup_events
alias kbl_initialize initialize
alias kbl_update update
def initialize
kbl_initialize
@effect_surface = Light_Surface.new
@lantern = Light_DSource.new
end
def update(arg)
@effect_surface.refresh if arg
kbl_update(arg)
end
def first_tag(x,y)
tag = tileset.flags[tile_id(x,y,0)] >> 12
return tag > 0 ? tag : 0
end
def setup_events
@light_sources.nil? ? @light_sources = [] : @light_sources.clear
setup_surfaces
merge_surfaces
kbl_setup_events
end
def setup_surfaces
@surfaces = []
for x in 0..(width-1)
for y in 0..(height-1)
tag = first_tag(x,y)
if tag == Wall_Tag
i = tile_id(x,y,0)
if i & 0x02 == 0x02
@surfaces << Block_SD.new(x*32,y*32,x*32+32,y*32)
end
if i & 0x04 == 0x04
@surfaces << Block_WR.new(x*32+31,y*32,x*32+31,y*32+32)
@surfaces << Block_IL.new(x*32+32,y*32,x*32+32,y*32+32)
end
if i & 0x01 == 0x01
@surfaces << Block_IR.new(x*32-1,y*32,x*32-1,y*32+32)
@surfaces << Block_WL.new(x*32,y*32,x*32,y*32+32)
end
elsif tag == Roof_Tag
i = tile_id(x,y,0)
@surfaces << Block_SU.new(x*32,y*32,x*32+32,y*32) if i & 0x02 == 0x02
@surfaces << Block_SR.new(x*32+31,y*32,x*32+31,y*32+32) if i & 0x04 == 0x04
@surfaces << Block_SL.new(x*32,y*32,x*32,y*32+32) if i & 0x01 == 0x01
elsif tag == Block_Tag
f = tileset.flags[tile_id(x,y,0)]
@surfaces << Block_SL.new(x*32,y*32,x*32,y*32+32) if f & 0x02 == 0x02
@surfaces << Block_SR.new(x*32+31,y*32,x*32+31,y*32+32) if f & 0x04 == 0x04
@surfaces << Block_SU.new(x*32,y*32,x*32+32,y*32) if f & 0x08 == 0x08
end
end
end
end
def merge_surfaces
new_surfaces = []
hs = []; vs = []
ws = []; is = []
for surface in @surfaces
if surface.type & 0x05 == 0
hs << surface
else
if surface.type & 0x010 == 0
vs << surface
else
if surface.type & 0x08 == 0
ws << surface
else
is << surface
end
end
end
end
for surface in hs
surface.ready ? next : surface.ready = true
for s in hs
next if s.ready || s.y1 != surface.y1 || surface.type != s.type
if s.x2 == surface.x1
surface.x1 = s.x1
s.trash = true
s.ready = true
surface.ready = false
elsif s.x1 == surface.x2
surface.x2 = s.x2
s.trash = true
s.ready = true
surface.ready = false
end
end
end
hs.each { |s| @surfaces.delete(s) if s.trash}
for surface in vs
surface.ready ? next : surface.ready
for s in vs
next if s.ready || s.x1 != surface.x1
if s.y2 == surface.y1
surface.y1 = s.y1
s.trash = true
s.ready = true
surface.ready = false
elsif s.y1 == surface.y2
surface.y2 = s.y2
s.trash = true
s.ready = true
surface.ready = false
end
end
end
vs.each { |s| @surfaces.delete(s) if s.trash}
for surface in ws
surface.ready ? next : surface.ready
for s in ws
next if s.ready || s.x1 != surface.x1
if s.y2 == surface.y1
surface.y1 = s.y1
s.trash = true
s.ready = true
surface.ready = false
elsif s.y1 == surface.y2
surface.y2 = s.y2
s.trash = true
s.ready = true
surface.ready = false
end
end
end
ws.each { |s| @surfaces.delete(s) if s.trash}
for surface in is
surface.ready ? next : surface.ready
for s in is
next if s.ready || s.x1 != surface.x1
if s.y2 == surface.y1
surface.y1 = s.y1
s.trash = true
s.ready = true
surface.ready = false
elsif s.y1 == surface.y2
surface.y2 = s.y2
s.trash = true
s.ready = true
surface.ready = false
end
end
end
is.each { |s| @surfaces.delete(s) if s.trash}
end
end
class Game_Event < Game_Character
alias kbl_initialize initialize
alias kbl_setup_page setup_page
def initialize(m,e)
@light = nil
kbl_initialize(m,e)
end
def setup_page(np)
kbl_setup_page(np)
setup_light(np.nil?)
end
def setup_light(dispose)
unless @light.nil?
$game_map.light_sources.delete(self)
@light.dispose
@light = nil
end
unless dispose && @list.nil?
for command in @list
if command.code == 108 && command.parameters[0].include?("[light")
command.parameters[0].scan(/\[light ([0.0-9.9]+)\]/)
effect = Light_Core::Effects[$1.to_i]
@light = Light_SSource.new(self,effect[0],effect[1],effect[2],effect[3])
$game_map.light_sources << self
return
end
end
end
end
def draw_light
sx = @light.sx
sy = @light.sy
w = @light.w
h = @light.h
return if sx > 544 && sy > 416 && sx + w < 0 && sy + h < 0
$game_map.light_surface.bitmap.blt(sx,sy,@light.bitmap,Rect.new(0,0,w,h),@light.opacity)
end
def dispose_light
@light.dispose
end
def restore_light
@light.restore
end
end
if Light_Core::Surface_UE
class Game_Interpreter
def command_223
$game_map.effect_surface.change_color(@params[1],@params[0].red,@params[0].green,@params[0].blue,@params[0].gray)
wait(@params[1]) if @params[2]
end
end
end
class Game_Interpreter
def self_event
return $game_map.events[@event_id]
end
end
class Block_Surface
include Light_Core
attr_accessor :x1
attr_accessor :y1
attr_accessor :x2
attr_accessor :y2
attr_accessor :ready
attr_accessor :trash
def initialize(x1,y1,x2,y2)
@x1 = x1
@y1 = y1
@x2 = x2
@y2 = y2
@ready = false
@trash = false
end
def within?(min_x,max_x,min_y,max_y)
return @x2 > min_x && @x1 < max_x && @y2 > min_y && @y1 < max_y
end
end
class Block_SL < Block_Surface
attr_reader :type
def initialize(x1,y1,x2,y2)
super(x1,y1,x2,y2)
@type = 0x01
end
def visible?(sx,sy)
return sx < @x1
end
def render_shadow(phx,phy,sx,sy,range,bitmap)
@m1 = (@y1-sy)/(@x1-sx)
@n1 = sy - @m1*sx
@m2 = (@y2-sy)/(@x2-sx)
@n2 = sy - @m2*sx
for x in @x1..(sx+range)
init = shadow_iy(x)
bitmap.clear_rect(x-phx,init-phy,1,shadow_fy(x)-init+3)
end
end
def shadow_iy(x)
return @m1*x+@n1
end
def shadow_fy(x)
return @m2*x+@n2
end
end
class Block_SR < Block_Surface
attr_reader :type
def initialize(x1,y1,x2,y2)
super(x1,y1,x2,y2)
@type = 0x04
end
def visible?(sx,sy)
return sx > @x1
end
def render_shadow(phx,phy,sx,sy,range,bitmap)
@m1 = (@y1-sy)/(@x1-sx)
@n1 = sy - @m1*sx
@m2 = (@y2-sy)/(@x2-sx)
@n2 = sy - @m2*sx
for x in (sx-range).to_i..@x1
init = shadow_iy(x)
bitmap.clear_rect(x-phx,init-phy,1,shadow_fy(x)-init+3)
end
end
def shadow_iy(x)
return @m1*x+@n1
end
def shadow_fy(x)
return @m2*x+@n2
end
end
class Block_IL < Block_Surface
attr_reader :type
def initialize(x1,y1,x2,y2)
super(x1,y1,x2,y2)
@type = 0x019
end
def visible?(sx,sy)
return sx < @x1 && sy > @y1
end
def render_shadow(phx,phy,sx,sy,range,bitmap)
@m1 = (@y1-sy)/(@x1-sx)
@n1 = @y1 - @m1*@x1
@m2 = (@y2-sy)/(@x2-sx)
@m2 = 0 if @m2 > 0
@n2 = @y2 - @m2*@x2
for x in @x1..(sx+range)
init = shadow_iy(x).floor
bitmap.clear_rect(x-phx,init-3-phy,1,shadow_fy(x)-init+3)
end
end
def shadow_iy(x)
return @m1*x+@n1
end
def shadow_fy(x)
return @m2*x+@n2
end
end
class Block_IR < Block_Surface
attr_reader :type
def initialize(x1,y1,x2,y2)
super(x1,y1,x2,y2)
@type = 0x01c
end
def visible?(sx,sy)
return sx > @x1 && sy > @y1
end
def render_shadow(phx,phy,sx,sy,range,bitmap)
@m1 = (@y1-sy)/(@x1-sx)
@n1 = @y1 - @m1*@x1
@m2 = (@y2-sy)/(@x2-sx)
@m2 = 0 if @m2 < 0
@n2 = @y2 - @m2*@x2
for x in (sx-range).to_i..@x1
init = shadow_iy(x).floor
bitmap.clear_rect(x-phx,init-3-phy,1,shadow_fy(x)-init+3)
end
end
def shadow_iy(x)
return @m1*x+@n1
end
def shadow_fy(x)
return @m2*x+@n2
end
end
class Block_WL < Block_Surface
attr_reader :type
def initialize(x1,y1,x2,y2)
super(x1,y1,x2,y2)
@type = 0x011
end
def visible?(sx,sy)
return sx < @x1 && sy < @y2
end
def render_shadow(phx,phy,sx,sy,range,bitmap)
@m1 = (@y1-sy)/(@x1-sx)
@n1 = sy - @m1*sx
@m2 = (@y2-sy)/(@x2-sx)
@n2 = sy - @m2*sx
for x in @x1..(sx+range)
init = shadow_iy(x)
bitmap.clear_rect(x-phx,init-phy,1,shadow_fy(x)-init+2)
end
end
def shadow_iy(x)
return @m1*x+@n1
end
def shadow_fy(x)
return @m2*x+@n2
end
end
class Block_WR < Block_Surface
attr_reader :type
def initialize(x1,y1,x2,y2)
super(x1,y1,x2,y2)
@type = 0x014
end
def visible?(sx,sy)
return sx > @x1 && sy < @y2
end
def render_shadow(phx,phy,sx,sy,range,bitmap)
@m1 = (@y1-sy)/(@x1-sx)
@n1 = sy - @m1*sx
@m2 = (@y2-sy)/(@x2-sx)
@n2 = sy - @m2*sx
for x in (sx-range).to_i..@x1
init = shadow_iy(x)
bitmap.clear_rect(x-phx,init-phy,1,shadow_fy(x)-init+2)
end
end
def shadow_iy(x)
return @m1*x+@n1
end
def shadow_fy(x)
return @m2*x+@n2
end
end
class Block_SU < Block_Surface
attr_reader :type
def initialize(x1,y1,x2,y2)
super(x1,y1,x2,y2)
@type = 0x02
end
def visible?(sx,sy)
return sy < @y1
end
def render_shadow(phx,phy,sx,sy,range,bitmap)
if @x1 == sx
@m1 = nil
else
@m1 = (@y1-sy)/(@x1-sx)
@m1 += ACC if @m1 < -ACC
@n1 = @y1 - @m1*@x1
end
if @x2 == sx
@m2 = nil
else
@m2 = (@y2-sy)/(@x2-sx)
@n2 = sy - @m2*sx
end
for y in @y1..(sy+range)
init = shadow_ix(y)
bitmap.clear_rect(init-phx,y-phy,shadow_fx(y)-init+1,1)
end
end
def shadow_ix(y)
return @m1.nil? ? @x1 : (y-@n1)/@m1
end
def shadow_fx(y)
return @m2.nil? ? @x2 : (y-@n2)/@m2
end
end
class Block_SD < Block_Surface
attr_reader :type
def initialize(x1,y1,x2,y2)
super(x1,y1,x2,y2)
@type = 0x08
end
def visible?(sx,sy)
return sy > @y1
end
def render_shadow(phx,phy,sx,sy,range,bitmap)
if @x1 == sx
@m1 = nil
else
@m1 = (@y1-sy)/(@x1-sx)
@m1 -= ACC if @m1 > ACC
@n1 = sy - @m1*sx
end
if x2 == sx
@m2 = nil
else
@m2 = (@y2-sy)/(@x2-sx)
@n2 = sy - @m2*sx
end
for y in (sy-range).to_i..@y1
init = shadow_ix(y)
bitmap.clear_rect(init-phx,y-phy,shadow_fx(y)-init+1,1)
end
end
def shadow_ix(y)
return @m1.nil? ? @x1 : (y-@n1)/@m1
end
def shadow_fx(y)
return @m2.nil? ? @x2 : (y-@n2)/@m2
end
end
class Spriteset_Map
include Light_Core
alias kbl_initialize initialize
alias kbl_update update
alias kbl_dispose dispose
def initialize
setup_lights
kbl_initialize
end
def update
kbl_update
update_lights
end
def dispose
kbl_dispose
dispose_lights
end
def dispose_lights
$game_map.lantern.dispose
$game_map.light_sources.each { |source| source.dispose_light }
$game_map.light_surface.bitmap.dispose
$game_map.light_surface.dispose
$game_map.light_surface = nil
end
def update_lights
$game_map.light_surface.bitmap.clear
$game_map.light_surface.bitmap.fill_rect(0,0,544,416,$game_map.effect_surface.color)
$game_map.light_sources.each { |source| source.draw_light }
return unless $game_map.lantern.visible
@btr = $game_map.lantern.get_graphic
x = $game_map.lantern.x
y = $game_map.lantern.y
r = $game_map.lantern.range
sx = x + r
sy = y + r
dr = r*2
$game_map.surfaces.each { |s| s.render_shadow(x,y,sx,sy,r,@btr) if s.visible?(sx,sy) && s.within?(x,x+dr,y,y+dr) }
$game_map.light_surface.bitmap.blt($game_map.lantern.sx,$game_map.lantern.sy,@btr,Rect.new(0,0,dr,dr),$game_map.lantern.opacity)
end
def setup_lights
@btr = nil
$game_map.lantern.restore
$game_map.light_sources.each { |source| source.restore_light }
$game_map.light_surface = Sprite.new
$game_map.light_surface.bitmap = Bitmap.new(544,416)
$game_map.light_surface.bitmap.fill_rect(0,0,544,416,$game_map.effect_surface.color)
$game_map.light_surface.blend_type = 2
$game_map.light_surface.opacity = $game_map.effect_surface.alpha
$game_map.light_surface.z = Surface_Z
end
end |
Lorsque l'un ou l'autre n'est pas activé, la touche d'action marche. Alors une fois de plus, je ne sais pas d'où ça vient...
|
FdRstar -
posté le 27/02/2013 à 18:44:20 (10 messages postés)
| | Support : VX Ace
Bonjour, j'aimerais juste savoir comment récupérer l'id de l'ennemi à la position x dans un combat. En fait, je veux la stocker dans une variable dans un évènement commun. Merci.
Résolu : voir en-dessous
|
Estheone -
posté le 06/03/2013 à 20:06:37 (312 messages postés)
| | En appel de script :
1
2
| enemy = $game_troop.members[y]
$game_variables[x] = enemy ? enemy.enemy_id : 0 |
En remplaçant x par l'id de ta variable et y par l'index de l'ennemi (en partant de 0).
|
Wandering Souls : Jeu complet / Topic sur Oniro |
FdRstar -
posté le 06/03/2013 à 21:02:52 (10 messages postés)
| | Merci, ça marche bien.^^
| Aller à la page 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73Index du forum > Entraide > [Scripts] Petites questions connes sur les SCRIPTS!!
|