Investigacion: Crear misiones.

Ver el tema anterior Ver el tema siguiente Ir abajo

Investigacion: Crear misiones.

Mensaje  Josuviz el Mar Mayo 25, 2010 1:35 am

Voy a investigar sobre la asignacion de misiones y para ello indagare en la mision de ascold. Usare este hilo para dejar constancia de los progresos y pasos de la misma investigacion.

- Como se que la mision de Askold te la da el mismisimo Askold en su casa, pues voy al aC y al aH de Ascold a ver que saco en claro. Leyendo el aH me llaman la atencion las siguientes lineas
"El terrible corsario vuelve a asomar por el horizonte. ¿Qué queréis esta vez?", (18)
"Esta vez me envía ", (19)
", dueño de una tienda situada en ", (20)
"Eh, conozco a este tipo. Está bien, de acuerdo. Sentaos y nos echaremos unos tragos de vodka.", (21)
"La verdad es que el vodka ruso escasea por estas partes. Podéis beber ron jamaicano hasta hartaros, pero comparado con el vodka sabe a rayos.", (22)
"Al grano. Decidme de qué queréis hablar conmigo.", (23)
" dijo que buscabais polvo de momia. Lo tengo.", (24)
"Muy bien. Os pagaré 30.000 por el polvo." (25)
Estas lineas son con seguridad las que salen en la conversacion cuando le vendes el polvo de momia (Es muy obvio xD). Entonces, para que me pongan sobre la pista en el aC, busco que numero de linea tienen asignado. (Que ya he marcado en azul). Sabiendo esto, buscare la linea "21" en el aC. Con el comando buscar del bloc de notas, llego a esta parte del archivo
case "Step_5":
sld = characterFromId(pchar.questTemp.Ascold.TraderId);
dialog.text = DLG_TEXT_Q[21]+
DLG_TEXT_Q[22]+
DLG_TEXT_Q[23];
link.l1 = sld.lastname + DLG_TEXT_Q[24];
link.l1.go = "Step_6";
break;

case "Step_6":
dialog.text = DLG_TEXT_Q[25];
link.l1 = DLG_TEXT_Q[26];
if (CheckCharacterItem(pchar, "Powder_mummie"))
{
link.l1.go = "Step_7";
TakeItemFromCharacter(pchar, "Powder_mummie");
AddMoneyToCharacter(pchar, 30000);

}
else
{
link.l1.go = "No_Powder";
}
break;

case "No_Powder":
dialog.text = DLG_TEXT_Q[27]+
DLG_TEXT_Q[28];
link.l1 = DLG_TEXT_Q[29];
link.l1.go = "Step_4";
NextDiag.TempNode = "First time";
CloseQuestHeader("Ascold");
pchar.questTemp.Ascold = "BreakeQuest";

break;

case "Step_7":
dialog.text = DLG_TEXT_Q[30];
link.l1 = DLG_TEXT_Q[31];
link.l1.go = "Step_8";
break;
Si os fiajis, he marcado algunas lineas en verde. Es muy interesante el step_6. Si os dais cuenta, crea una condicion en el link.l#go, if (CheckCharacterItem(pchar, "Powder_mummie")), que indica que se compruebe (CheckCharacterItem) si el jugador (pchar) tiene el polvo de momia (Powder_mummie). Es decir que si en el momento en el que os dicen
"Muy bien. Os pagaré 30.000 por el polvo." (25)
, teneis el polvo, direis la linea 26 = ""Buen precio. Sellémoslo con un apretón de manos.", y os quitaran el polvo de momia del inventario (TakeItemFromCharacter(pchar, "Powder_mummie");) y os daran 30.000 piastras (AddMoneyToCharacter(pchar, 30000);). Pero en caso de que no lo tengais el link.l#.go sera
else
{
link.l1.go = "No_Powder";
}
. En el case no_Podwer se dicen las lineas:
Ascold: 27-"¡Fuera de aquí, amigo! No tenéis el polvo y no me gusta hablar con los que me intentan timar .", 28-"¡Así que largaos de aquí!",
Personaje: 29 -"Oh, venga. ¡Solo estaba bromeando! Nunca se me habría ocurrido...",
Y entonces, aparecen 3 comandos
NextDiag.TempNode = "First time";
CloseQuestHeader("Ascold");
pchar.questTemp.Ascold = "BreakeQuest";
El comando NextDiag.TempNode = "Nombre_del_case"; indica que la proxima vez que se hable con el NPC, se vaya a la linea de dialogo del case que indiques. En este caso, la proxima vez que hablemos con Ascold, empezaremos desde el case First time.
El comando CloseQuestHeader("Ascold"); no se exactamente para que sirve, pero puede que cierre la mision principal de Ascold, y el comando pchar.questTemp.Ascold = "BreakeQuest"; puede que termine con la mision temporal de Ascold.

Para comprobar la sospecha de la funcion del "pchar.questTemp.Ascold = "BreakeQuest", me voy a fijar en las partes de la conversacion en las que aparece, y con ayuda de las lineas de dialogo sabre que se dice y podre sacar una conclusion
case "No_Work":
dialog.text = "¿Ah, sí? No me gusta que me digan que no, me dan ganas de perder de vista a la persona. ¡Fuera de mi casa!";
link.l1 = "¡Eh! ¿Qué estáis haciendo?";
link.l1.go = "Step_4";
NextDiag.TempNode = "First time";
CloseQuestHeader("Ascold");
pchar.questTemp.Ascold = "BreakeQuest";

group_DeleteGroup("Ascold_Spa_Attack");
DeleteAttribute(PChar, "questTemp.Ascold.Ship");
break;

case "Step_10":
dialog.text = "Bien. Ahora escuchad lo que necesito que encontréis.",
"Tengo que encontrar la estatuilla de Achcuahzin, el mensajero azteca que declaró la guerra, una vasija ceremonial y un cuchillo ceremonial."
;
link.l1 = "Vale, estaré alerta. Cuando tenga los tres objetos volveré a veros.";
link.l1.go = "exit";
pchar.questTemp.Ascold = "SeekThreeObject";
NextDiag.TempNode = "ResultOfSeek";
AddQuestRecord("Ascold", "3");
break;


case "Step_11":
dialog.text = "Je. Estoy dispuesto a pagar 30.000 por cada uno, así que en total son 90.000 monedas. ¿Os parece bien?";
link.l1 = "Me parece bien el precio. Sellémoslo con un apretón de manos.";
if (pchar.questTemp.Ascold == "SoughtThreeObject")
{
link.l1 = "Si supierais cuánto he pagado por los artefactos, Askold... Pero entiendo que no sería de esperar que me devolvieses el dinero, y en cualquier caso me estáis ofreciendo seis veces más de lo que pagué, así que de acuerdo.";
}
link.l1.go = "Step_12";
link.l2 = "No, dadme más dinero.";
link.l2.go = "WantMoreMoney";
break;

case "WantMoreMoney":
dialog.text = "Oh, así que sí. Parece que me equivoqué con vos. Vuestra avaricia no conoce límites. Ni conozco a esas personas ni me importan. Y no quiero tener nada más que ver con vos.";
link.l1 = "¡Eh, Askold, esperad! Ambos somos personas razonables. Seguro que podemos llegar a un acuerdo...";
link.l1.go = "Step_4";
NextDiag.TempNode = "First time";
CloseQuestHeader("Ascold");
pchar.questTemp.Ascold = "BreakeQuest";

break;
Bien, si os dais cuenta, donde ascold se enfada, aparece el CloseQuestHeader("Ascold");pchar.questTemp.Ascold = "BreakeQuest";, y cuando por ejemplo avanzamos en la historia aparece por ejemplo pchar.questTemp.Ascold = "SeekThreeObject";, estableciendo una nueva mision temporal. Es interesante lo que os he remarcado en naranja, AddQuestRecord("Ascold", "3");, este comando indica que se escriba en el diario, en las lineas de la mision de ascold, el texto #3. Si vamos al archivo
Age of Pirates 2\RESOURCE\INI\texts\russian\questbook\quests_texts.txt
, veremos que se corresponde a la linea "Accedí a buscar tres objetos sagrados del culto de los pieles rojas: una máscara de oro rojo, una vasija ceremonial y un cetro sacerdotal.".

He realizado una prueba con el diario. He modificado el archivo del diario, y he escrito lo siguiente
#QUEST Prueba
Algo que escribir en el diario
#TEXT 1
¡He conseguido un autografo!

#TEXT dum
El #QUEST Prueba, es el identificador del diario. El Algo que escribir en el diario, es el titulo de la entrada del diario. El #TEXT 1; ¡He conseguido un autografo! sera la entrada numero 1 (y unica). Y finalmente el #TEXT dum sirve para indicar que alli acaban las entradas del diario.
Despues he modificado la conversacion con un mercader de la calle

(...)
link.l# = "Quiero escribir algo en el diario";
link.l#.go = "diario";
break;

case "diario":
dialog.text = "Bien, puedo dejarte mi firma";
link.l1 = "Gracias por tu colaboracion";
link.l1.go = "exit";
AddQuestRecord("Prueba", "1");
break;
Y ¡zas! se quedo grabado bien en el diario, pirat

Con lo escrito aqui, podriamos crear misiones sencillas, del tipo "busqueda de tesoros", con anotaciones en el diario incluidas. No es mucho, pero creo que es aceptable.
Hasta ahora, siempre hemos tenido que depender de personajes "prelocalizados" para poder iniciar las conversaciones (comerciantes ambulantes, personajes del tipo Ascold, etc...), ya que no sabiamos implantar personajes en el juego... hasta ahora, pirat . Me ha dado por investigar nuevamente como podria implantar personajes, pero a diferencia de otras veces, esta vez lo consegui. La mala noticia es que sólo se verán si inicias partida nueva Shocked .


Implantacion de NPCs en el juego (Sencillo)
Al ver en el Gm_view los models de las ciudades, estaba convencido de que los personajes se situaban en las ciudades por que respondian a una localizacion especificada en algun archivo, ya que solo se ve ciudad en los modelos de las ciudades (edificios, los puestos ambulantes pero sin vendedores...), y los modelos de los personajes son independientes, puesto que se mueven e interactuan. Pensando en el directorio mas indicado para albergar la informacion que necesito, di con este directorio:
Age of Pirates 2\Program\characters\init
Se ve que alli, estan las localizaciones de los personajes! no se como no me di cuenta antes. El problema era cuando veia la informacion, y mas o menos podia intuir su significado y utilidad pero aun tardaria un poco mas en dominarla, por lo que en linea con lo dicho en el post, recorde que mi amigo Ascold, me espera siempre sentado en su casa de Guadeloupe. No obstante la informacion de Ascold se encontraba en el aC "StoryCharacters.C":
//////////////////=====>>>> Ìàãè÷åñêèé êâåñò Àñêîëüäà.
makeref(ch,Characters[n]); // Àñêîëüä
ch.name = xiDStr("Ascold");
ch.lastname = "";
ch.id = "Ascold";
ch.model = "Corsair1_2";
ch.model.animation = "man";
ch.sex = "man";

ch.location = "BasTer_houseSp1";
ch.location.group = "sit";
ch.location.locator = "sit1";

ch.Dialog.Filename = "Quest\Ascold.c";
ch.nation = PIRATE;
ch.rank = 38;
ch.reputation = "15";
SetSelfSkill(ch, 90, 90, 90, 70, 90);
SetShipSkill(ch, 20, 90, 10, 10, 10, 20, 10, 10, 50);
LAi_NoRebirthDisable(ch); // âîñêðåñòü ïðè óáèåíèè
LAi_SetSitType(ch);
LAi_SetLoginTime(ch, 0.0, 24.0);
LAi_SetHP(ch, 200.0, 200.0);
LAi_SetImmortal(ch, true);
ch.greeting = "Gr_Ascold";
n = n+1;
Hay mucha informacion, pero para situar al personaje (NPC), de momento nos fijaremos en lo mas esencial.
Remarcado en naranja y por orden:
+ Nombre del model que "ilustrara" al NPC. Es decir, la apariencia del nuevo NPC que nos concedera las nuevas misiones.
+ Animacion del model, importante por si hacemos que se mueva o defienda... no quieras luchar contra un blandiblú! (jajajaja)
+ Género del NPC, para que le hagan reverencias (woman) o no (man) lol.

Remarcado en Azul:
+ Localizacion donde se encuentra el NPC. En el directorio
AOP2/program/locations/init
se encuentran las localizaciones posibles en los mapas. Aun asi para hacer una probatina, cogeremos esta localizacion, que se corresponde con el interior de la casa de Ascold.
+ Indica el grupo de localizador. Con el modo beta "on", presionando F11/instalaciones/mostrar buscador, podemos ver en el juego las localizaciones exactas, representadas por burbujas de colores. El grupo del localizador se situa encima del nombre del localizador.
+ Indica el localizador, es decir, el punto exacto donde se insertara al npc.

La linea verde, señala el archivo de conversacion, y podemos crear uno desde 0, nada de modificar. (¡Esta idea me gusto mucho!). Luego sería cuestion de indicarle la direccion correcta.
Abro el archivo "Guadeloupe.C" de la carpeta init, plara implementar un nuevo personaje. (Por supuesto, ya tengo una copia de seguridad del archivo). La idea es, implementar un personaje con unos valores ya determinados, y cambiar los datos de localizacion. Como me gusta divertirme, hare que el amigo Morgan, tal cual, este de pie en casa de Ascold, mientras este sigue emborrachandose con Ron. Ademas, esa info esta en el mismo archivo en el que encontre la informacion de Ascold asi que la tenia a mano. Esta es la informacion de Morgan:

//============== Ãåíðè Ìîðãàí! Âñåì òðåïåòàòü. =================
makeref(ch,Characters[n]);
ch.name = xiDStr("Henry");
ch.lastname = xiDStr("Morgan");
ch.id = "Henry Morgan";
ch.model = "Morgan";
ch.model.animation = "man";
ch.sex = "man";
ch.location = "PortRoyal_houseS1";
ch.location.group = "sit";
ch.location.locator = "sit2";

ch.Dialog.Filename = "Quest\Morgan.c";
ch.nation = PIRATE;
GiveItem2Character(ch, GUN_COMMON);
ch.equip.gun = GUN_COMMON;
GiveItem2Character(ch, "blade27");// ñàáëÿ Ìîðãàíà
ch.equip.blade = "blade27";
// ==> Êîðàáëèê Ìîðãàíó äåëàåì ñ õîðîøèìè ïóøêàìè
ch.Abordage.Enable = false; // ÍÅËÜÇß!
ch.Ship.Name = "Elisabett";
ch.Ship.Type = GenerateShip(SHIP_FRIGATE, true);
ch.Ship.Stopped = true;
ch.Ship.Cannons.Type = CANNON_TYPE_CANNON_LBS48;
SetCrewQuantityFull(ch);
Fantom_SetBalls(ch, "pirate");
ch.rank = 45;
SetRandSPECIAL(ch);
SetSelfSkill(ch, 90, 90, 90, 60, 70);
SetShipSkill(ch, 100, 10, 100, 100, 90, 60, 80, 90, 50);
ch.money = "50000";
SetCharacterPerk(ch, "FastReload");
SetCharacterPerk(ch, "HullDamageUp");
SetCharacterPerk(ch, "SailsDamageUp");
SetCharacterPerk(ch, "CrewDamageUp");
SetCharacterPerk(ch, "CriticalShoot");
SetCharacterPerk(ch, "LongRangeShoot");
SetCharacterPerk(ch, "CannonProfessional");
SetCharacterPerk(ch, "ShipDefenseProfessional");
SetCharacterPerk(ch, "ShipSpeedUp");
SetCharacterPerk(ch, "ShipTurnRateUp");
SetCharacterPerk(ch, "SwordplayProfessional");
SetCharacterPerk(ch, "AdvancedDefense");
SetCharacterPerk(ch, "CriticalHit");
SetCharacterPerk(ch, "Sliding");
LAi_NoRebirthDisable(ch);
LAi_RebirthOldName(ch);
LAi_SetHuberType(ch);
ch.standUp = true; //âñòàâàòü è íàïàäàòü íà âðàãà
LAi_group_MoveCharacter(ch, "ENGLAND_CITIZENS");
LAi_SetLoginTime(ch, 0.0, 24.0);
LAi_SetImmortal(ch, true);
LAi_SetHP(ch, 230.0, 230.0);
ch.greeting = "Gr_Morgan";
n = n + 1;
Como veis, el Morgan es un P_to crack!, fijaos cuantas indicaciones, (barco incluido!). He remarcado en azul la informacion que cambiaremos para ver si Morgan se digna en aparecer en la casa de Ascold. Como no sabia que valores se le podian dar en los diferentes campos, fui observando en los demas archivos, al tabernero, la camarera, usureros, ascold, gobernadores...etc. Y bueno haciendo pruebas, una combinacion que me gusto el resultado fue la que hice con este cambio:
(...)
ch.model = "Morgan";
ch.model.animation = "man";
ch.sex = "man";
ch.location =
"BasTer_houseSp1";
ch.location.group = "barmen";
ch.location.locator = "stay";
(...)

Y bueno hice la prueba. No sabeis lo curioso que me parecio ver a HMorgan tan "campechanamente", sentado en una silla imaginaria... no se como lo hace, pero este "personaje" siempre se las arregla para estar por encima de toda situacion... lol.

[Tienes que estar registrado y conectado para ver esa imagen]

Lo mejor fue cuando Henry me echó de su casa al hablarle muchas veces sin tener nada que contarle... y apareci en Port Royal!!!, jajaja.

Bueno, segui investigando y en las lineas de "ch.standup" y "LAI_sethubertype" las anule poniendo "//" delante, y puse esta nueva "LAi_SetStayType(ch);" ya que haciendo pruebas, el personaje no me hablaba, pero me fije que al quitarle esas lineas y añadirle esta, si que lo consegui. De hecho, si lo unico que queremos es que un personaje este de pie para hablarnos, puede que no hagan falta mas lineas incluso menos que estas:
makeref(ch,Characters[n]); // Ëþáîâü ïîíèìàøü...
ch.name = "nombredelnpc";
ch.lastname = "apellidodelnpc";
ch.id = "idexclusivodelnpc";
ch.model = "modeldelnpc";
ch.sex = "generodelnpc";
ch.model.animation = "animaciondelmodeldelnpc";
ch.location = "escenariodeljuegodondeapareceraelnpc";
ch.location.group = "grupodellocalizador";
ch.location.locator = "localizadorespecifico";
ch.Dialog.Filename = "aCdelnpc";
ch.nation = SPAIN; //nacionalidad
ch.rank = 8; // nivel del npc
ch.money = "10000"; //dinero del npc?
LAi_NoRebirthEnable(ch); // no revive si muere
LAi_SetStayType(ch); // Permanece de pie?
LAi_group_MoveCharacter(ch, "SPAIN_CITIZENS"); // ¿?
LAi_SetLoginTime(ch, 0.0, 24.0); // horario de spawn
LAi_SetHP(ch, 75.0, 75.0); // puntos de vida y ¿energia?
n = n + 1; // linea obligatoria


Última edición por Admin el Lun Jul 05, 2010 11:50 am, editado 17 veces (Razón : Actualizando...)
avatar
Josuviz
Admin

Mensajes : 101
Fecha de inscripción : 20/05/2010

Ver perfil de usuario http://gamers.activoforo.com

Volver arriba Ir abajo

Re: Investigacion: Crear misiones.

Mensaje  Gedrox el Mar Mayo 25, 2010 1:54 am

tal ves enves de darle polvo de momia le des una vela hay q probar eso

Gedrox

Mensajes : 15
Fecha de inscripción : 24/05/2010

Ver perfil de usuario

Volver arriba Ir abajo

Re: Investigacion: Crear misiones.

Mensaje  Josuviz el Mar Mayo 25, 2010 2:44 am

Gedrox escribió:tal ves enves de darle polvo de momia le des una vela hay q probar eso
Solo tendriamos que modificar la linea;
if (CheckCharacterItem(pchar, "Powder_mummie")),
por la linea;
if (CheckCharacterItem(pchar, "mineral3")),
Con esto hariamos que al comprar una vela, y llevarla en el inventario, ascold la tomara por el polvo de momia, (xDD).
avatar
Josuviz
Admin

Mensajes : 101
Fecha de inscripción : 20/05/2010

Ver perfil de usuario http://gamers.activoforo.com

Volver arriba Ir abajo

Re: Investigacion: Crear misiones.

Mensaje  Gedrox el Mar Mayo 25, 2010 3:36 am

eres un as amigo ya vemos que podemos engañar a askold con el polvo de momia a ver q mas se puede modificar tocare los archivos del juego a ver que descubro para aportar

Gedrox

Mensajes : 15
Fecha de inscripción : 24/05/2010

Ver perfil de usuario

Volver arriba Ir abajo

Re: Investigacion: Crear misiones.

Mensaje  Josuviz el Mar Jun 15, 2010 1:02 am

Actualizacion: Implantacion de NPCs (Precario).

Ahora ya podemos poner, de forma muy poco estudiada, NPCs en el juego. Lo malo es que solo seran visibles en nuevas partidas.

Seguire alimentando a mi curiosidad, lol.
avatar
Josuviz
Admin

Mensajes : 101
Fecha de inscripción : 20/05/2010

Ver perfil de usuario http://gamers.activoforo.com

Volver arriba Ir abajo

Re: Investigacion: Crear misiones.

Mensaje  jadero el Vie Jul 08, 2011 10:37 am

Cada vez lo tengo más claro a Josuviz le gusta jugar a ser Dios Twisted Evil
avatar
jadero

Mensajes : 2
Fecha de inscripción : 03/02/2011

Ver perfil de usuario

Volver arriba Ir abajo

Re: Investigacion: Crear misiones.

Mensaje  Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.