Schlosserset in Westentasche NEU

Kein Durchblick im Quellcode von Ja2? Hier werden sie geholfen.

Moderator: Flashy

Antworten
Wulfy301
Bravo-Squad
Beiträge: 640
Registriert: 18 Jun 2004, 22:58

Schlosserset in Westentasche NEU

Beitrag von Wulfy301 » 22 Mär 2008, 18:40

Hallo Leute

Ich werde das Sourceforum mal wieder aktivieren, da Realist uns ja die Möglichkeit gegeben hat wieder selber Einfluss an den 1.13 SC zu nehmen.

Realist hat mir für den 1.12 SC das Schlosserset so verändert das es auch in den Westentaschen der Rüstungen vom Spiel erkannt wurde und man es nicht mehr in die Hand nehmen musste, damit man damit Türen öffnen konnte.
In 1.13 funktioniert diese Änderung nicht mehr, weil verschiedene Programm technische Änderungen vorgenommen wurden.
Wer kann mir bei einer Lösung helfen damit das auch in 1.13 funktioniert?

Hier ist die alte Variante=>
Lösung:
Tactical\Interface.c, void PopupDoorOpenMenu( BOOLEAN fClosingDoor )


aus
[font=Courier New, monospace]// Grayout if no lockpick found....[/font][font=Courier New, monospace]
if ( FindObj( gOpenDoorMenu.pSoldier, LOCKSMITHKIT ) == NO_SLOT )
[/font][font=Courier New, monospace]
{
[/font][font=Courier New, monospace]
DisableButton( iActionIcons[ LOCKPICK_DOOR_ICON ] );
[/font][font=Courier New, monospace]
}
[/font]

wird
[font=Courier New, monospace]// Grayout if no lockpick found....[/font][font=Courier New, monospace]
if ( FindObj( gOpenDoorMenu.pSoldier, LOCKSMITHKIT ) == NO_SLOT && FindAttachment( &(gOpenDoorMenu.pSoldier->inv[VESTPOS]), LOCKSMITHKIT ) == ITEM_NOT_FOUND )
[/font][font=Courier New, monospace]
{
[/font][font=Courier New, monospace]
DisableButton( iActionIcons[ LOCKPICK_DOOR_ICON ] );
[/font][font=Courier New, monospace]
}
[/font]

Tactical\SkillCheck.c
, INT32 SkillCheck( SOLDIERTYPE * pSoldier, INT8 bReason, INT8 bChanceMod )

aus
[font=Courier New, monospace]// adjust chance based on status of kit[/font][font=Courier New, monospace]

bSlot = FindObj( pSoldier, LOCKSMITHKIT );
[/font][font=Courier New, monospace]
if (bSlot == NO_SLOT)
[/font][font=Courier New, monospace]
{
[/font][font=Courier New, monospace]
// this should never happen, but might as well check...
[/font][font=Courier New, monospace]
iSkill = 0;
[/font][font=Courier New, monospace]
}
[/font][font=Courier New, monospace]
iSkill = iSkill * pSoldier->inv[bSlot].bStatus[0] / 100;
[/font]
wird
[font=Courier New, monospace]// adjust chance based on status of kit
[/font][font=Courier New, monospace]bSlot = FindObj( pSoldier, LOCKSMITHKIT );
[/font][font=Courier New, monospace]if (bSlot == NO_SLOT)
[/font][font=Courier New, monospace]{
[/font][font=Courier New, monospace]if ( FindAttachment( &pSoldier->inv[VESTPOS], LOCKSMITHKIT ) == ITEM_NOT_FOUND )
[/font][font=Courier New, monospace]{
[/font][font=Courier New, monospace]// this should never happen, but might as well check...
[/font][font=Courier New, monospace]iSkill = 0;
[/font][font=Courier New, monospace]}
[/font][font=Courier New, monospace]else
[/font][font=Courier New, monospace]{
[/font][font=Courier New, monospace]iSkill = iSkill * pSoldier->inv[VESTPOS].bAttachStatus[ FindAttachment(&(pSoldier->inv[VESTPOS]), LOCKSMITHKIT) ] / 100;
[/font][font=Courier New, monospace]}
[/font][font=Courier New, monospace]}
[/font][font=Courier New, monospace]else
[/font][font=Courier New, monospace]{
[/font][font=Courier New, monospace]iSkill = iSkill * pSoldier->inv[bSlot].bStatus[0] / 100;[/font] [font=Courier New, monospace]}[/font]
Wenn man das so in 1.13 eingibt kommen folgende Fehlermeldungen:

1>.\SkillCheck.cpp(258) : error C2446: '==': Keine Konvertierung von 'int' in 'OBJECTTYPE *'
1> Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
1>.\SkillCheck.cpp(258) : error C2040: '==': 'OBJECTTYPE *' unterscheidet sich von 'int' in Bezug auf die Anzahl vorgenommener Dereferenzierungen
1>.\SkillCheck.cpp(265) : error C2039: 'bAttachStatus': Ist kein Element von 'OBJECTTYPE'
1> c:\neu 1.13\build\tactical\Item Types.h(434): Siehe Deklaration von 'OBJECTTYPE'
1>.\SkillCheck.cpp(270) : error C2039: 'bStatus': Ist kein Element von 'OBJECTTYPE'
1> c:\neu 1.13\build\tactical\Item Types.h(434): Siehe Deklaration von 'OBJECTTYPE'
1>Interface.cpp
1>.\Interface.cpp(2338) : error C2446: '==': Keine Konvertierung von 'int' in 'OBJECTTYPE *'
1> Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
1>.\Interface.cpp(2338) : error C2040: '==': 'OBJECTTYPE *' unterscheidet sich von 'int' in Bezug auf die Anzahl vorgenommener Dereferenzierungen

Mfg...
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:

Realist
Alpha-Squad
Beiträge: 1573
Registriert: 24 Apr 2003, 11:00
Wohnort: Düsseldorf

Beitrag von Realist » 22 Mär 2008, 21:04

Mal eine Idee (nicht im Detail getestet und kein Anspruch auf gutes C++):

In items.cpp gibt es eine Funktion zum Aufspüren von Dietrichitems, ist glaub ich in 113 neu dazu gekommen. Man könnte sie in etwa so umschreiben:

Code: Alles auswählen

OBJECTTYPE* FindLocksmithKit( SOLDIERTYPE * pSoldier)
{
    INT8 bLoop;

    for (bLoop = 0; bLoop < (INT8) pSoldier->inv.size(); bLoop++)
    {
        if (pSoldier->inv[bLoop].exists())
        {
            if (Item[pSoldier->inv[bLoop].usItem].locksmithkit)
            {
                return &pSoldier->inv[bLoop];
            }
            else
            {
                // investigate attachments
                attachmentList::iterator iter;
                attachmentList* attachments = &pSoldier->inv[bLoop].objectStack.front().attachments;

                for (iter = attachments->begin(); iter != attachments->end(); iter++)
                {
                    if (Item[iter->usItem].locksmithkit)
                        return &*iter;
                }
            }
        }
    }
    return( NULL );
}
Dann müssten von jedem Item zusätzlich die Attachments durchsucht werden (eine Ebene tief). Wird was gefunden, kann mans weiterverwursten.

Wulfy301
Bravo-Squad
Beiträge: 640
Registriert: 18 Jun 2004, 22:58

Beitrag von Wulfy301 » 22 Mär 2008, 21:46

Hab's getestet, funktioniert aber noch nicht.

Original->
INT8 FindLocksmithKit( SOLDIERTYPE * pSoldier )
{
INT8 bLoop;

for (bLoop = 0; bLoop < (INT8) pSoldier->inv.size(); bLoop++)
{
if (pSoldier->inv[bLoop].exists() == true) {
if (Item[pSoldier->inv[bLoop].usItem].locksmithkit )
{
return( bLoop );
}
}
}
return( NO_SLOT );
}
So habe ich es mit deinem Vorschlag geändert...
INT8 FindLocksmithKit( SOLDIERTYPE * pSoldier )
{
INT8 bLoop;

for (bLoop = 0; bLoop < (INT8) pSoldier->inv.size(); bLoop++)
{
if (pSoldier->inv[bLoop].exists() == true) {
if (Item[pSoldier->inv[bLoop].usItem].locksmithkit )
{
return( bLoop );
}
else
{
// investigate attachments
attachmentList::iterator iter;
attachmentList* attachments = &pSoldier->inv[bLoop].objectStack.front().attachments;

for (iter = attachments->begin(); iter != attachments->end(); iter++)
{
if (Item[iter->usItem].locksmithkit)
return &*iter;
}
}
}
}
return( NULL );
}
...und ergibt folgende Fehlermeldung...

1>.\Items.cpp(8052) : error C2440: 'return': 'OBJECTTYPE *' kann nicht in 'INT8' konvertiert werden
1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist

Mfg..
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:

Realist
Alpha-Squad
Beiträge: 1573
Registriert: 24 Apr 2003, 11:00
Wohnort: Düsseldorf

Beitrag von Realist » 22 Mär 2008, 21:52

Kann auch gar nicht, da die Signatur entscheidend geändert wird.
Was zu tun bleibt, ist die Funktionsdeklaration entsprechend zu ändern, sowie die beiden Aufrufe zu modifizieren, so dass das Ergebnis richtig ausgewertet wird.

War eher als Ansatz zu verstehen...

Wulfy301
Bravo-Squad
Beiträge: 640
Registriert: 18 Jun 2004, 22:58

Beitrag von Wulfy301 » 22 Mär 2008, 22:00

Aha...:confused:

Mfg...
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:

Wulfy301
Bravo-Squad
Beiträge: 640
Registriert: 18 Jun 2004, 22:58

Beitrag von Wulfy301 » 26 Mär 2008, 00:24

sorry wegen den doppel post!

Kann hier sonst noch jemand helfen?:uhoh:

Mfg...
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:

Realist
Alpha-Squad
Beiträge: 1573
Registriert: 24 Apr 2003, 11:00
Wohnort: Düsseldorf

Beitrag von Realist » 26 Mär 2008, 08:23

Huch, den Fred gibts auch noch. :red:

Also gut, was ich noch meinte wäre dann im Detail folgendes:
In Items.h den Prototype ändern zu:
OBJECTTYPE* FindLocksmithKit( SOLDIERTYPE * pSoldier );

In interface.cpp - void PopupDoorOpenMenu( BOOLEAN fClosingDoor ) muss das dann so aussehen:

Code: Alles auswählen

// Grayout if no lockpick found....
	// if (FindLocksmithKit( gOpenDoorMenu.pSoldier ) == NO_SLOT )
	if ( FindLocksmithKit( gOpenDoorMenu.pSoldier ) == NULL )
	{
		DisableButton( iActionIcons[ LOCKPICK_DOOR_ICON ] );
	}
Zuletzt SkillCheck.cpp / INT32 SkillCheck( SOLDIERTYPE * pSoldier, INT8 bReason, INT8 bChanceMod )

Code: Alles auswählen

OBJECTTYPE *lockpickkit;
    [...]

            // adjust chance based on status of kit
            /*bSlot = FindLocksmithKit( pSoldier );
            if (bSlot == NO_SLOT)
            {
                // this should never happen, but might as well check...
                iSkill = 0;
            }
            iSkill = iSkill * pSoldier->inv[bSlot][0]->data.objectStatus / 100;
            */
            lockpickkit = FindLocksmithKit (pSoldier);
            if (lockpickkit == NULL)
                iSkill = 0;
            else
                iSkill = iSkill * lockpickkit->objectStack.front().data.objectStatus / 100;
            break;
Vielleicht möchtest du dich mal mehr um die Grundlagen bemühen? Die scheinen dir doch arg zu fehlen.

Wulfy301
Bravo-Squad
Beiträge: 640
Registriert: 18 Jun 2004, 22:58

Beitrag von Wulfy301 » 26 Mär 2008, 11:05

Danke Realist, wie immer spitzen Arbeit!:erdbeerteechug:

Wenn ich genug Zeit, oder eine Möglichkeit für Abendkurse in der Umgebung hätte, wäre das schon längst geschehen.
Glaub mir, es macht keinen Spaß ständig um Hilfe bitten zu müssen!:shakehead2:


Mfg...
Du hast Probleme mit dem "grünen Rand" (Item-Dateien)? Sinclair hat die Lösung -> Guckst Du hier!:hit:

Antworten