Seite 1 von 1

Schlosserset in Westentasche NEU

Verfasst: 22 Mär 2008, 18:40
von Wulfy301
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...

Verfasst: 22 Mär 2008, 21:04
von Realist
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.

Verfasst: 22 Mär 2008, 21:46
von Wulfy301
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..

Verfasst: 22 Mär 2008, 21:52
von Realist
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...

Verfasst: 22 Mär 2008, 22:00
von Wulfy301
Aha...:confused:

Mfg...

Verfasst: 26 Mär 2008, 00:24
von Wulfy301
sorry wegen den doppel post!

Kann hier sonst noch jemand helfen?:uhoh:

Mfg...

Verfasst: 26 Mär 2008, 08:23
von Realist
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.

Verfasst: 26 Mär 2008, 11:05
von Wulfy301
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...